【问题标题】:R collapse and auto fill blanks in rowsR折叠并自动填充行中的空白
【发布时间】:2019-02-28 11:45:00
【问题描述】:

我有以下示例数据集:

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)

如何使用data.tabletidyverseIHave 转到Iwant

实际上我有大约 000 行。

【问题讨论】:

  • 谢谢大家,我接受了@akrun 的回答,但我真的可以选择任何一个。

标签: r data.table tidyverse


【解决方案1】:

基于示例,在按'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

【讨论】:

    【解决方案2】:

    您可以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)
    

    【讨论】:

      【解决方案3】:

      您可以转置您的数据并使用来自dplyrcoalesce

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

      结果是一个字符向量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        • 2018-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-03
        相关资源
        最近更新 更多