将每一列中的所有单元格折叠为一个单元格并忽略 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_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
如果我有如下数据框:
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_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