基于 "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 行。任何关于如何编码的想法?
谢谢!
如果var2
和var3
对于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 观测值都合并到原始数据集中。
我有一个非常混乱的数据框(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 行。任何关于如何编码的想法?
谢谢!
如果var2
和var3
对于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 观测值都合并到原始数据集中。