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

Collapse all cells in each column to one cell and ignore NA

如果我有如下数据框:

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,然后将每一列 cbind 在一起,但必须有更简单的方法....

你可以简单地做,

sapply(a, function(i)toString(i[!is.na(i)]))
apply(a, 2, function(x) paste(na.omit(x), collapse=","))

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)

带有 pivot_longersummarise

的选项
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