Свернуть все ячейки в каждом столбце в одну ячейку и игнорировать NA - PullRequest
1 голос
/ 24 января 2020

Если у меня есть фрейм данных следующим образом:

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, затем связать каждый столбец вместе, но должен быть более простой способ ....

Ответы [ 4 ]

2 голосов
/ 24 января 2020

Вы можете просто сделать,

sapply(a, function(i)toString(i[!is.na(i)]))
1 голос
/ 24 января 2020
apply(a, 2, function(x) paste(na.omit(x), collapse=","))
0 голосов
/ 24 января 2020

Опция с 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    
0 голосов
/ 24 января 2020

Версия 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...