代码之家  ›  专栏  ›  技术社区  ›  brucezepplin

将每列中的所有单元格折叠为一个单元格并忽略NA

  •  0
  • brucezepplin  · 技术社区  · 5 年前

    如果我有如下数据帧:

    a <- data.frame(col1 = c("A",NA,NA),
                    col2 = c(NA,"B","C"),
                    col3 = c(NA,NA,"D"))
    
      col1 col2 col3
    1    A <NA> <NA>
    2 <NA>    B <NA>
    3 <NA>    C    D
    

    如何折叠成数据帧,如:

    col1   col2   col3
    ----   ----   ----
    A      B,C    D
    

    我知道我可以做这样的事情:

    gsub("NA,","",paste(a,1],collapse=","))
    

    一次折叠一列,然后删除剩余的NA,然后将每一列绑定在一起,但必须有一种更简单的方法。。。。

    2 回复  |  直到 5 年前
        1
  •  2
  •   Sotos    5 年前

    你可以简单地做,

    sapply(a, function(i)toString(i[!is.na(i)]))
    
        2
  •  1
  •   NicolasH2    5 年前
    apply(a, 2, function(x) paste(na.omit(x), collapse=","))
    
        3
  •  0
  •   Georgery    5 年前

    这个 tidyverse 版本:

    如果你想有一个像我一样干净的工作区,可能想写一个函数并将其应用于所有列。

    library(dplyr)
    
    a <- data.frame(col1 = c("A",NA,NA),
                    col2 = c(NA,"B","C"),
                    col3 = c(NA,NA,"D"))
    
    collapseColumn <- function(x){
        paste(
            x[!is.na(x)]
            , collapse = ",")
    }
    
    
    a %>%
        summarise_all(collapseColumn)
    
        4
  •  0
  •   akrun    5 年前

    一个选项 pivot_longer summarise

    library(dplyr)
    library(tidyr)
    a  %>% 
       pivot_longer(cols = everything(), values_drop_na = TRUE) %>% 
       group_by(name) %>% 
       summarise(value = toString(value))
    # A tibble: 3 x 2
    #  name  value
    #  <chr> <chr>
    #1 col1  A    
    #2 col2  B, C 
    #3 col3  D