【问题标题】:How to index and print columnnames based on dataframe cells matching specific conditions如何根据匹配特定条件的数据框单元格索引和打印列名
【发布时间】: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


    【解决方案1】:

    应该这样做...

    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
    

    【讨论】:

    • 还有d$newcol &lt;- apply(!is.na(d), 1, function(x) paste(names(d)[x], collapse=", "))
    • 谢谢你们!第一个解决方案看起来与我的许多尝试中的一个没有太大不同......我非常感谢现在能够继续。虽然令人沮丧,但我很想解决这个问题而不必打扰你。无论如何,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2021-05-03
    相关资源
    最近更新 更多