【问题标题】:How to identify which columns are not “NA” per row in a dataframe?如何识别数据框中每行哪些列不是“NA”?
【发布时间】:2020-11-03 08:31:13
【问题描述】:

这与How to identify which columns are not "NA" per row in a matrix? 的问题相同,但针对的是数据框而不是矩阵。

我有一个包含 205 行和 62 列的数据框。我想确定每行没有 NA 作为其值的列名。例如:

        col1 col2 col3 col4 col5 col6
row1    NA   NA   NA   NA   fact fact
row2    num  num  NA   NA   NA   NA
row3    num  num  NA   NA   int  int    
row4    NA   NA   NA   NA   fact fact
row5    NA   NA   int  int  NA   NA
row6    NA   NA   int  NA   NA   NA

结果应该是:

row1    col5;col6
row2    col1;col2
row3    col1;col2;col5;col6
row4    col5;col6
row5    col3;col4
row6    col3

理想情况下,结果应该作为额外的列添加到数据框中。

【问题讨论】:

  • df$non_nas <- apply(!is.na(df), 1, function(x) paste(colnames(df)[x], collapse = ";"))
  • 使用whichtapply 的选项:idx <- which(!is.na(dat), arr.ind = TRUE); stack(tapply(row.names(idx), names(dat)[idx[, 'col']], toString))

标签: r dataframe na


【解决方案1】:

遍历行,获取非 na 列的列名,然后粘贴:

d$myCol <- apply(d, 1, function(i) paste(colnames(d)[ !is.na(i) ], collapse = ","))

【讨论】:

    【解决方案2】:

    使用dplyr 与@zx8754 类似的逻辑你可以这样做:

    library(dplyr)
    
    df %>%
      tibble::rownames_to_column('row') %>%
      rowwise() %>%
      mutate(res = toString(names(df)[!is.na(c_across(starts_with('col')))])) %>%
      select(row, res)
    
    #   row   res                   
    #  <chr> <chr>                 
    #1 row1  col5, col6            
    #2 row2  col1, col2            
    #3 row3  col1, col2, col5, col6
    #4 row4  col5, col6            
    #5 row5  col3, col4            
    #6 row6  col3               
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多