基于R中的条件列名创建新数据框列

hmae6n7t  于 2023-01-15  发布在  其他
关注(0)|答案(3)|浏览(142)

我正在使用一个大型数据集。此数据集包含一个引用代码列和其他值为TRUE或FALSE的列。我正在尝试创建一个新列,以收集值等于TRUE的列的串联名称(或列表形式)。 Dataframe 的简化如下所示:

data <- data.frame( Reference = c("001", "002", "003", "004", "005"),
                 Column A = c(TRUE, TRUE, FALSE, TRUE, FALSE), 
                 Column B = c(FALSE, TRUE, TRUE, FALSE, FALSE), 
                 Column C = c(TRUE, FALSE, TRUE, FALSE, TRUE))
data

预期结果如下所示:
| 参考文献|色谱柱A|B栏|C栏|D栏|
| - ------|- ------|- ------|- ------|- ------|
| 零零零一|正确|错误|正确|A列、C列|
| 小零零零二|正确|正确|错误|A列、B列|
| 小零零零三|错误|正确|正确|B列、C列|
| 0004|正确|错误|错误|色谱柱A|
| 小零零五|错误|错误|正确|C栏|
我知道如何通过连接值或列名来创建字段,但我不知道如何引入条件,以便它只接受值为TRUE的列名。
提前感谢你!!

rnmwe5a2

rnmwe5a21#

tidyverse解决方案与tidyr::unite()

library(tidyverse)

data %>%
  mutate(unite(across(starts_with('Column'), ~ ifelse(.x, cur_column(), NA)),
               col = 'Column_D', sep = ', ', na.rm = TRUE))

#   Reference Column_A Column_B Column_C           Column_D
# 1       001     TRUE    FALSE     TRUE Column_A, Column_C
# 2       002     TRUE     TRUE    FALSE Column_A, Column_B
# 3       003    FALSE     TRUE     TRUE Column_B, Column_C
# 4       004     TRUE    FALSE    FALSE           Column_A
# 5       005    FALSE    FALSE     TRUE           Column_C
gojuced7

gojuced72#

碱R溶液

data <- data.frame( Reference = c("001", "002", "003", "004", "005"),
                    Column_A = c(TRUE, TRUE, FALSE, TRUE, FALSE), 
                    Column_B = c(FALSE, TRUE, TRUE, FALSE, FALSE), 
                    Column_C = c(TRUE, FALSE, TRUE, FALSE, TRUE))

L <- apply(data, 1, function(i) which(i == TRUE))
data$Column_D <- lapply(L, function(x) paste0(names(x), collapse = ", "))

#   Reference Column_A Column_B Column_C           Column_D
# 1       001     TRUE    FALSE     TRUE Column_A, Column_C
# 2       002     TRUE     TRUE    FALSE Column_A, Column_B
# 3       003    FALSE     TRUE     TRUE Column_B, Column_C
# 4       004     TRUE    FALSE    FALSE           Column_A
# 5       005    FALSE    FALSE     TRUE           Column_C
dm7nw8vv

dm7nw8vv3#

另一个dplyr选项:

data %>% 
  rowwise() %>% 
  mutate(Column_D = toString(names(across(starts_with("Column")))[which(c_across(starts_with("Column")))]))

  Reference Column_A Column_B Column_C Column_D          
  <chr>     <lgl>    <lgl>    <lgl>    <chr>             
1 001       TRUE     FALSE    TRUE     Column_A, Column_C
2 002       TRUE     TRUE     FALSE    Column_A, Column_B
3 003       FALSE    TRUE     TRUE     Column_B, Column_C
4 004       TRUE     FALSE    FALSE    Column_A          
5 005       FALSE    FALSE    TRUE     Column_C

相关问题