【问题标题】:Merging duplicated rows according to NA's in R根据 R 中的 NA 合并重复的行
【发布时间】:2020-11-18 12:33:11
【问题描述】:

我有一个数据集,其中包含按 ID 重复的行,每个都有一些 NA。我对每个 ID 的最新观察结果感兴趣。我怎样才能将它们结合起来以充分利用两行(最快和最新)?

df_in <-
    data.frame(A = c(as.Date("2020-01-01"), as.Date("2020-01-02"), as.Date("2020-01-02")),
               Name = c("Adam","Adam","Rob"),
               B = c(1,2,3),
               C = c(1,2,3),
               D = c(NA,2,3))
  
  df_out <-
    data.frame(A = c(as.Date("2020-01-01"), as.Date("2020-01-03")),
               Name = c("Adam","Rob"),
               B = c(1,3),
               C = c(1,3),
               D = c(2,3))

如何让R根据时间列拉取最接近的值(根据变量名称合并重复的行)并删除最新的??

【问题讨论】:

  • 您是在执行前向填充还是简单地删除NAs?
  • 名称列是否引用数据中的 ID?为什么 Rob 的日期(A 列)变为 03?
  • @NelsonGon 前向填充,因为两列中经常会有 NA,这会让我失去两行。 @KarthikS 是的对不起,应该和Rob的情况无关。我只是想明确一点,我想通过按 ID(名称)分组来合并不同的日期(尽可能接近)来填充彼此的 NA

标签: r dplyr duplicates na


【解决方案1】:

使用 dplyr,

df_in %>% arrange(-A) %>%
    filter(!duplicated(Name))

【讨论】:

    【解决方案2】:

    使用dplyr,您可以使用多个ifelse 命令来实现。

    library(dplyr)
    
    df_solution = df_in %>%
      group_by(Name) %>%
      arrange(A) %>%
      mutate(B = ifelse(is.na(B), 
                        ifelse(!is.na(lag(B)), lag(B), lead(B)),
                        B
                        ),
             C = ifelse(is.na(C), 
                        ifelse(!is.na(lag(C)), lag(C), lead(C)),
                        C
                        ),
             D = ifelse(is.na(D), 
                        ifelse(!is.na(lag(D)), lag(D), lead(D)),
                        D
                        )
             )
    

    如果具有相同 Name 的某些条目在表格中间之前具有 NA,请使用 arrange(-A) 而不是 arrange(A) 或两者兼而有之。

    但是,如果您的数据中有很大的“漏洞”,并且有很长的 NA 序列,则需要在一个周期内来回移动以删除所有 NA。使用这种方法,填充最后一个 NA 将不具有一致性,因为有些将用前一个值填充,有些用下一个填充。如果是这种情况并且一致性很重要,那么这个解决方案就不是那么好。

    我也不确定您是否需要为每个名称设置一个唯一条目,但如果需要,您也可以这样做

    df_filtered = df_solution %>%
      group_by(Name) %>%
      arrange(A) %>%
      filter(A == min(A))
    

    如果您需要每个人最早的条目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多