【问题标题】:Eliminate row from data.frame based on partially duplicate values根据部分重复的值从 data.frame 中删除行
【发布时间】:2021-02-24 17:28:22
【问题描述】:

我有一个相对较大的 data.frame,其中包含 205K 观察值和 54 个变量。此 data.frame 是附加三个不同 data.frame 的结果。原始 data.frames 都有日期、时间、lat 和 lon 列,但是每个 data.frame 都带有我需要保留的附件信息。因此,在最终的 data.frame 中,我有三行的集合,其中日期、时间、纬度、经度完全相同,但 var1、var2 等的值不同,有些是 NA。我的 data.frame 的简化版本可能如下所示:

mydf
  var1 date time var2 var3 var4 var5 var6 lat lon
1    A    1    2    3    4    5    6    7   8   9
2    B    1    2 <NA> <NA> <NA>    6    7   8   9
3 <NA>    1    2 <NA> <NA> <NA> <NA> <NA>   8   9

特别是,我想在我的 data.frame 中突出显示那些具有相同日期、时间、纬度和经度的行集,但只保留例如 var1 不是 NA 的行集,以便最终数据.frame 应如下所示:

  var1 date time var2 var3 var4 var5 var6 lat lon
1    A    1    2    3    4    5    6    7   8   9
2    B    1    2 <NA> <NA> <NA>    6    7   8   9

我知道我可以使用

distinct(mydf, ..., .keep_all = TRUE)

但我不知道如何正确使用这些参数。非常感谢任何帮助。

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    与dplyr:

    首先从上到下识别duplicated 行,以获取具有selected 变量的所有重复行。然后filter,其中这个新变量是TRUE,而var1 不是NA:

    library(dplyr)
    
    
    mydf %>% mutate(dup = duplicated(select(., date, time, lat, lon)) | 
                          duplicated(select(., date, time, lat, lon), fromLast = TRUE)) %>% 
             filter(dup == TRUE & !is.na(var1))
    

    【讨论】:

    • 感谢大卫的回答。该代码不适用于我的具体情况。一旦为我的 data.frame 调整它,它的工作原理就是删除所有 var1 = NA 的行,无论该特定行在 data.frame 中是否在日期、时间、纬度和朗。基本上,它会删除原始表之一的全部内容。你能建议任何其他方法吗?谢谢
    • 正如你所说:“只保留那些,例如,var1 不是 NA”。我编写的脚本给出了您预期的输出。你能澄清一下情况吗?
    【解决方案2】:

    我找到了一种不太直接且很可能不太优雅的解决方案来处理我的特定 data.frame 中的重复行,方法是首先向我的所有 data.frames 添加一个“datetime”列,然后通过“减去”一个数据。框架到另一个,最后通过将它们附加到最终的data.frame

    #my data.frames
    #df1
    #df2
    
    df1<- mutate(df1, datetime = paste(df1$date, df1$time)) #add a column "datetime" by concatenating the columns "date" and "time"
    df2<- mutate(df2, datetime = paste(df2$date, df2$time)) #add a column "datetime" by concatenating the columns "date" and "time"
    
    df1<-anti_join(df1, df2, by ="datetime") #delete from df1 those rows that occur in df2 based on the column "datedime"
    
    df.f<-rbind.fill(df1, df2) #append the two data.frames in "df.f"
    

    可能不是最快的方法,但它适用于我的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      相关资源
      最近更新 更多