簡體   English   中英

根據 R 中的條件列名稱創建新的數據框列

[英]Create new data frame column based on conditioned column names in R

我正在處理一個大型數據集。 該數據集有一個帶有參考代碼的列和其他值為 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列
0001 真的 錯誤的 真的 A 欄,第 C 欄
0002 真的 真的 錯誤的 A列,B列
0003 錯誤的 真的 真的 B欄,欄C
0004 真的 錯誤的 錯誤的 A列
0005 錯誤的 錯誤的 真的 專欄C

我知道如何通過連接值或列名來創建字段,但我不知道如何引入條件,以便它只采用值為 TRUE 的列的名稱。

非常感謝您!

使用tidyr::unite()tidyverse解決方案:

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

基地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

另一個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          

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM