我所拥有的是如下所示的数据集
A B C
Yes No No
No Yes No
No No Yes
Yes No Yes
No Yes Yes
我有兴趣创建一个新列D,它存储列名称,其中单元格值==是。最终所需的输出应该如下所示
A B C Result
Yes No No A
No Yes No B
No No Yes C
Yes No Yes A,C
No Yes Yes B,C
这是我到目前为止所做的,它非常笨拙。
df$d1 <- ifelse(df[,1]=="Yes", paste(colnames(df[1])),"" )
df$d2 <- ifelse(df[,2]=="Yes", paste(colnames(df[2])),"" )
df$d3 <- ifelse(df[,3]=="Yes", paste(colnames(df[3])),"" )
但我对这样做的有效方法感兴趣。非常感谢任何帮助。
答案 0 :(得分:4)
首先让我们看看是的。这将是一个逻辑矩阵:
yes_mat = data == "Yes"
对于每一行,您需要数据框的名称为“是”,names(data)[x]
其中x
是yes_mat
的一行。将函数应用于矩阵的行最好使用apply
。我们将匹配的行粘贴在一起,用逗号折叠:
apply(yes_mat, 1, FUN = function(x) paste(names(data)[x], collapse = ","))
# [1] "A" "B" "C" "A,C" "B,C"
答案 1 :(得分:1)
df <- data.frame(A = c("Yes","Yes","No","No","Yes"),
B = c("Yes","No","No","Yes","Yes"),
C = c("No","No","Yes","Yes","Yes"))
dlist <- vector('list', nrow(df))
for (i in 1:nrow(df)) {
t <- grep("Yes",unlist(df[i,]))
dlist[[i]] <- colnames(df[t])
}
df$result <- dlist
答案 2 :(得分:0)
这是一种方法,无需创建子集化的临时矩阵,使用:
df <- data.frame(A = c('Yes', 'No', 'No', 'Yes', 'No'),
B = c('No', 'Yes', 'No', 'No', 'Yes'),
C = c('No', 'No', 'Yes', 'Yes', 'Yes'),
stringsAsFactors = FALSE)
df$Result <- apply(df, 1, function(x) paste(names(which(x == 'Yes')), collapse = ','))
产生的结果是:
A B C Result
1 Yes No No A
2 No Yes No B
3 No No Yes C
4 Yes No Yes A,C
5 No Yes Yes B,C