在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
相关产品推荐
相关产品推荐

