You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R的dplyr中创建标识其他列中TRUE所在列的新列

这有几个高效的向量化解法,完全不用手动循环,处理大数据量时也能保持速度:

首先先确认你的数据:

library(tibble)
df = tibble(x = c(TRUE, TRUE, FALSE, TRUE), 
            y = c(FALSE, FALSE, FALSE, TRUE), 
            z = c(TRUE, TRUE, FALSE, FALSE))

方法1:用base R的apply(简洁高效)

apply可以按行遍历数据框,结合which快速定位TRUE的列索引,再用paste拼接成你要的格式:

df$true_cols <- apply(df, 1, function(row) {
  # 找出当前行中TRUE所在的列位置
  true_pos <- which(row)
  # 如果没有TRUE就返回NA,否则拼接成带括号的字符串
  if (length(true_pos) == 0) {
    NA_character_
  } else {
    paste0("(", paste(true_pos, collapse = ", "), ")")
  }
})

方法2:tidyverse风格(适合已经在用dplyr的场景)

用pmap_chr逐行处理,配合stringr来格式化输出:

library(dplyr)
library(stringr)
library(purrr)

df <- df %>%
  mutate(true_cols = pmap_chr(., ~ {
    true_pos <- which(c(...) == TRUE)
    case_when(
      length(true_pos) == 0 ~ NA_character_,
      TRUE ~ str_c("(", str_c(true_pos, collapse = ", "), ")")
    )
  }))

两种方法运行后都会得到你想要的结果:

# A tibble: 4 x 4
  x     y     z     true_cols
  <lgl> <lgl> <lgl> <chr>    
1 TRUE  FALSE TRUE  (1, 3)   
2 TRUE  FALSE TRUE  (1, 3)   
3 FALSE FALSE FALSE NA       
4 TRUE  TRUE  FALSE (1, 2)   

这两种方法都是底层优化过的向量化操作,比手动写for循环高效太多,数据量越大优势越明显。

内容的提问来源于stack exchange,提问作者Omry Atia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:35:32