R свернуть и автоматически заполнить пробелы в строках - PullRequest
0 голосов
/ 28 февраля 2019

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

ID = c(123,123)
NAmer = c("ABC","ABC")
field1 =  c(1,NA)
field2 =  c(NA,2)
field3 = c(NA,NA)
field4 = c(NA,NA)
field5 = c(NA,NA)
IHave <- data.frame(ID,NAmer,field1,field2,field3,field4,field5)
Iwant <- c(123,"ABC",1,2,NA,NA,NA)

Как перейти от IHave к Iwant, используя data.table или tidyverse?

На практике у меня естьоколо 000 строк.

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Вы можете транспонировать свои данные и использовать coalesce из dplyr

do.call(dplyr::coalesce, as.data.frame(t(IHave), stringsAsFactors = FALSE))
# [1] "123" "ABC" " 1"  " 2"  NA    NA    NA 

В результате получается символьный вектор.

0 голосов
/ 28 февраля 2019

Вы можете map над столбцами, reduce используя каждый из них с помощью функции coalesce.Функция map_dfc используется вместо map, так что она связывает их вместе как кадр данных (df).Таким образом, первый столбец - reduce(IHave[[1]], coalesce) и т. Д.

library(tidyverse)

map_dfc(IHave, reduce, coalesce)
# # A tibble: 1 x 7
#      ID NAmer field1 field2 field3 field4 field5
#   <dbl> <fct>  <dbl>  <dbl> <lgl>  <lgl>  <lgl> 
# 1   123 ABC        1      2 NA     NA     NA  

Если вы хотите сделать это отдельно для каждой группы ID, NAmer, вы можете использовать приведенный ниже код.

IHave %>% 
  group_by(ID, NAmer) %>% 
  summarise_all(reduce, coalesce)
0 голосов
/ 28 февраля 2019

На основе примера, после группировки по 'ID', 'NAmer', оставьте только элементы не-NA, если есть хотя бы один элемент не-NA

library(dplyr)
IHave %>% 
   group_by(ID, NAmer) %>%
   summarise_all(list(~ if(all(is.na(.))) NA else .[!is.na(.)]))
# A tibble: 1 x 7
# Groups:   ID [1]
#    ID NAmer field1 field2 field3 field4 field5
#  <dbl> <fct>  <dbl>  <dbl> <lgl>  <lgl>  <lgl> 
#1   123 ABC        1      2 NA     NA     NA   

Или используя группупо coalesce

IHave %>%
    group_by(ID, NAmer) %>% 
    summarise_all(list(~ coalesce(!!! .))) 
# A tibble: 1 x 7
# Groups:   ID [1]
#    ID NAmer field1 field2 field3 field4 field5
#  <dbl> <fct>  <dbl>  <dbl> <lgl>  <lgl>  <lgl> 
#1   123 ABC        1      2 NA     NA     NA    

или по той же логике в data.table

library(data.table)
setDT(IHave)[, lapply(.SD, function(x) coalesce(!!! x)), .(ID, NAmer)]
#    ID NAmer field1 field2 field3 field4 field5
#1: 123   ABC      1      2     NA     NA     NA
...