基于 "near" 行值进行聚合

Aggregating based on "near" row values

我有一个非常混乱的数据框(webscraped),不幸的是其中有许多双重甚至三重条目。大多数数据框如下所示:

> df1<-data.frame(var1=c("a","a","b","b","c","c","d","d"),var2=c("right.a",NA,"right.b",NA,"right.c",NA,"right.d",NA),var3=c("correct.a","correct.a","correct.b","correct.b","correct.c","correct.c","correct.d","correct.d"))
> df1
  var1    var2      var3
1    a right.a correct.a
2    a    <NA> correct.a
3    b right.b correct.b
4    b    <NA> correct.b
5    c right.c correct.c
6    c    <NA> correct.c
7    d right.d correct.d
8    d    <NA> correct.d

"var1" 是我需要用来聚合的 ID 变量。我的目标是拥有一个如下所示的数据框:

  var1    var2      var3
1    a right.a correct.a
2    b right.b correct.b
3    c right.c correct.c
4    d right.d correct.d

然而,主要问题是,并不是整个数据框都是这样的。事实上,我还有其他部分是这样的:

> df2<-data.frame(var1=c("e","e","e","f","f","g","g","g"),var2=c(NA,NA,"right.e",NA,NA,NA,"right.g",NA),var3=c("correct.e","correct.e",NA,"correct.f",NA,"correct.g","correct.g",NA))
> df2
  var1    var2      var3
1    e    <NA> correct.e
2    e    <NA> correct.e
3    e right.e      <NA>
4    f    <NA> correct.f
5    f    <NA>      <NA>
6    g    <NA> correct.g
7    g right.g   wrong.g
8    g    <NA>      <NA>

和其他变化。最后,每个 ID 都应该有一行,其中包含正确的 var2 和 var3。在这一点上,我迷路了:我的 var1 是 not unique。但是,我知道 "belong" 在一起的重复 ID 在数据框中分组(如我的示例所示);例如第 4102 行和第 4103 行可能还有另一个 "a"。

我认为要走的路是使用带有 var1 作为 ID 的聚合,但另外告诉 R 聚合在这样做时应该只检查 var1 的 +-2 行。任何关于如何编码的想法?

谢谢!

如果var2var3对于var1的每个级别只有一个唯一值,则:

library(dplyr)

df = rbind(df1,df2)

df %>% group_by(var1) %>%
  summarise_all(funs(.[!is.na(.)][1]))
   var1    var2      var3
1     a right.a correct.a
2     b right.b correct.b
3     c right.c correct.c
4     d right.d correct.d
5     e right.e correct.e
6     f    <NA> correct.f
7     g right.g correct.g

这是一个使用data.table

的方法
library(data.table)

setDT(df1)[, .(var2[!is.na(var2)][1], var3[!is.na(var3)][1]), by=var1]
   var1      V1        V2
1:    a right.a correct.a
2:    b right.b correct.b
3:    c right.c correct.c
4:    d right.d correct.d

setDT(df2)[, .(var2[!is.na(var2)][1], var3[!is.na(var3)][1]), by=var1]
   var1      V1        V2
1:    e right.e correct.e
2:    f      NA correct.f
3:    g right.g correct.g

例如var2[!is.na(var2)][1]中的想法,从var2中获取第一个非缺失值。如果缺少所有值,则此 returns NA。此操作由 var1.

对两个变量执行

如果您有两个以上的变量,您可能会切换到 lapply。比如下面的。

df1[, lapply(.SD, function(i) i[!is.na(i)][1]), by=var1]
   var1    var2      var3
1:    a right.a correct.a
2:    b right.b correct.b
3:    c right.c correct.c
4:    d right.d correct.d

在多个 var1 具有有效值的情况下,这由一个非缺失的 var2 表示,那么您可以通过连接达到预期的结果。

数据来自评论,

df1<-data.frame(var1=c("a","a","b","b","c","c","d","d","a","a"),
                var2=c("right.a",NA,"right.b",NA,"right.c",NA,"right.d",NA,"right.a1",NA),
                var3=c("correct.a","correct.a","correct.b","correct.b","correct.c","correct.c","correct.d","correct.d","correct.a1","correct.a1"))

然后,有了这些数据,

setDT(df1)[df1[, .(var2=var2[!is.na(var2)]), by=var1], on=.(var1, var2)]
   var1     var2       var3
1:    a  right.a  correct.a
2:    a right.a1 correct.a1
3:    b  right.b  correct.b
4:    c  right.c  correct.c
5:    d  right.d  correct.d

在这里,var1 的所有非缺失 var2 观测值都合并到原始数据集中。