【发布时间】:2017-07-03 13:17:59
【问题描述】:
我遇到了一个编码问题,我无法自己解决,因此我非常感谢您的帮助。总而言之,我想创建一个附加到我的数据框的新列,列出与特定条件匹配的那些单元格的列名(逐行)。我找了很长时间的解决方案,但仍然没有找到适合我的解决方案。
假设我有一个这样的数据框:
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。我已经尝试了所有我能想到的单括号、双括号版本。我尝试将 which() 包含在应用中,我尝试了.. 很多。
据我所知,大多数时候我在 apply 函数中处理行,因为我希望函数在行上循环,最后在每行的末尾写一个新向量。但这并没有让我无所适从,众多版本之一就是这个:
col <- colnames(d)[apply(d, 1, function(x) which(!is.na(x),arr.ind=T))]
但它会打印一个错误:“colnames(d)[apply(d, 1, function(x) which(!is.na(x), arr.ind = T))] 中的错误:无效的下标类型'列表'"
所以我尝试解决列,但也没有这样做...:
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 and error。)
我很高兴向您学习。 非常感谢。 LK
【问题讨论】:
标签: r