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