根据特定单元格值捕获列名称

时间:2016-01-11 19:14:32

标签: r

我所拥有的是如下所示的数据集

    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])),"" )

但我对这样做的有效方法感兴趣。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

首先让我们看看是的。这将是一个逻辑矩阵:

yes_mat = data == "Yes"

对于每一行,您需要数据框的名称为“是”,names(data)[x]其中xyes_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