R折叠并自动填充行空白

时间:2019-02-28 11:45:01

标签: r data.table tidyverse

我有以下示例数据集:

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)

如何使用IHaveIwantdata.tabletidyverse

在实践中,我大约有000行。

3 个答案:

答案 0 :(得分:3)

根据示例,按“ 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

答案 1 :(得分:3)

您可以map遍历各列,reduce使用coalesce函数对每一列进行记录。使用函数map_dfc代替map,以便将它们c绑定在一起作为数据帧(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)

答案 2 :(得分:2)

您可以转置数据并使用coalesce中的dplyr

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

结果是一个字符向量。