如何根据符合特定条件的数据框单元索引和打印列名

时间:2017-07-03 13:17:59

标签: r

我遇到了编码问题,我无法自行解决,所以我很感激您的帮助。总而言之,我想创建一个附加到我的数据框的新列,列出符合特定条件(逐行)的单元格的列名。我已经搜索了很长时间的解决方案,但我仍然找不到合适的解决方案。

我们说我有一个这样的数据框:

a <- c(90, NA,20)
b <- c(NA, 89, 20)
d <- as.data.frame(cbind(a,b))
names(d) <- c("house", "cat")

  | house | cat
--|-------|----
1 | 90    | NA
--|-------|----
2 | NA    | 89
--|-------|----
3 | 20    | 20

我希望获得一个带有新列的最终数据框,其中列出了那些非NA的单元格值的所有列名。所以,理想情况下它看起来像这样:

   | house | cat | newcol
---|-------|-----|--------
1  | 90    | NA  | house  
---|-------|-----|--------
2  | NA    | 89  | cat    
---|-------|-----|--------
3  | 20    | 20  | house, cat

我必须承认 - 即使我现在已经连续约一个星期了 - 我无法索引单元格和列名。我尝试了for循环,我尝试过使用apply。我已经尝试过我能想到的每个支架,双支架版本。我尝试将()应用于其中,我尝试了很多。

大部分时间我在apply函数中对行进行处理,因为我理解它,我希望函数循环遍历行,最后在每行的末尾写一个新的向量。但它并没有让我失望,其中一个版本是这个:

col <- colnames(d)[apply(d, 1, function(x) which(!is.na(x),arr.ind=T))]

但是它会输出一个错误:&#34; colnames中的错误(d)[apply(d,1,function(x)which(!is.na(x),arr.ind = T))]:无效下标类型&#39; list&#39;&#34;

所以我尝试对列进行处理,而这些列也没有...:

col <- colnames(d)[apply(d, 2, function(x) which(!is.na(x),arr.ind=T))]
col
[1] "house" NA      "cat"   NA  

我还在apply中使用了colname引用,尝试逐行构建向量。 (我在colnamesindex周围尝试了print()或paste()):

similar <- c(similar, apply(d, 1, function(x) colnames(x)[x[!is.na(x)]]))

我尝试的最后一件事是没有循环:

e <- which(!is.na(d),arr.ind=T)
list <- names(d[e[,2]])
list
[1] "house"   "house.1" "cat"     "cat.1"  

但是这段代码在列中运行,并且输出不允许我将输出的元素与其对应的行匹配。

我非常感谢你的帮助。我觉得我并不是要求做一件复杂的事情,但对我来说这太复杂了。 (我想补充一点,我刚刚开始使用R,因此我目前的工作流程仍主要是google-trial和错误。)

我很高兴向你学习。 非常感谢你。 LK

1 个答案:

答案 0 :(得分:2)

应该这样做......

df$newcol <- apply(df,1,function(x) paste(names(df)[!is.na(x)],collapse=", "))

df
  house cat     newcol
1    90  NA      house
2    NA  89        cat
3    20  20 house, cat