R 在具有data.table的子组中查找相同的行
我的桌子有两个ID。我想,对于第一个ID的每个值,找出第二个ID值不同的两行是否相同(不包括第二个ID的列…)。 与我的表非常相似(但小得多)的是:R 在具有data.table的子组中查找相同的行,r,data.table,R,Data.table,我的桌子有两个ID。我想,对于第一个ID的每个值,找出第二个ID值不同的两行是否相同(不包括第二个ID的列…)。 与我的表非常相似(但小得多)的是: library(data.table) DT <- data.table(id = rep(LETTERS, each=10), var1 = rnorm(260), var2 = rnorm(260)) DT[, id2 := sample(c("A","B"),
library(data.table)
DT <- data.table(id = rep(LETTERS, each=10),
var1 = rnorm(260),
var2 = rnorm(260))
DT[, id2 := sample(c("A","B"), 10, T), by=id] # I need this to simulate different
# distribution of the id2 values, for
# each id value, like in my real table
setkey(DT, id, id2)
DT$var1[1] <- DT$var1[2] # this simulates redundances
DT$var2[1] <- DT$var2[2] # inside same id and id2
DT$var1[8] <- DT$var1[2] # this simulates two rows with different id2
DT$var2[8] <- DT$var2[2] # and same var1 and var2. I'm after such rows!
> head(DT, 10)
id var1 var2 id2
1: A 0.11641260243 0.52202152686 A
2: A 0.11641260243 0.52202152686 A
3: A -0.46631312530 1.16263285108 A
4: A -0.01301484819 0.44273945065 A
5: A 1.84623329221 -0.09284888054 B
6: A -1.29139503119 -1.90194818212 B
7: A 0.96073555968 -0.49326620160 B
8: A 0.11641260243 0.52202152686 B
9: A 0.86254993530 -0.21280899589 B
10: A 1.41142798959 1.13666002123 B
我想我得到了我想要的 这个怎么样
unique(setkey(DT))[, any(duplicated(.SD)), by=id, .SDcols = c("var1", "var2")]
在我的“慢速”机器上设置钥匙大约需要140秒。而实际的分组仍在进行…:)
这是我正在测试的巨大数据:
set.seed(1234)
DT <- data.table(id = rep(1:4500000, each=10),
var1 = sample(1000, 45000000, replace=TRUE),
var2 = sample(1000, 45000000, replace=TRUE))
DT[, id2 := sample(c("A","B"), 10, TRUE), by=id]
set.seed(1234)
DT这个怎么样
unique(setkey(DT))[, any(duplicated(.SD)), by=id, .SDcols = c("var1", "var2")]
在我的“慢速”机器上设置钥匙大约需要140秒。而实际的分组仍在进行…:)
这是我正在测试的巨大数据:
set.seed(1234)
DT <- data.table(id = rep(1:4500000, each=10),
var1 = sample(1000, 45000000, replace=TRUE),
var2 = sample(1000, 45000000, replace=TRUE))
DT[, id2 := sample(c("A","B"), 10, TRUE), by=id]
set.seed(1234)
DT iiuc,如果id2
同时具有A
和B
,那么您想检查是否存在重复的c(var1,var2)
行吗?是这样吗?是否可以有多个重复,例如:第3行和第4行彼此相同?如果是这样,那么对于任何数量的重复项,该值是否仍然为真?在您的示例中,ID2值为“相同”的两行是相同的,不是吗?@Arun嗨,我正在寻找ID2==“A”
的行与ID2==“B”的任何其他行对于id
的每个值相等。显然排除了id2列,因此c(var1,var2)
需要匹配。在我的示例中,具有相同id2的第1行和第2行是相同的。是的,我想用它来模拟我的真实表格,但这种情况在结果中不起作用,事实上我使用了unique(.SD)
,然后我删除了第三列,即id2
。Michele,这很混乱,因为你说一切似乎都正常,但输出结果与你解释的结果不符,不是吗?我的意思是,如果id2==A
的var1
和var2
与id2==B
的var1
和var2
中的任何一个相同,那么它应该是真的。但是当id2==a时,你有一个真的。。。第一排和第二排。。你能解释一下我是不是出了什么问题吗?@Arun好的,当然。我希望相同的行对应不同的id2
值。如果存在具有相同id2
的相同行,则unique(.SD)
将丢弃这些行。然后从a
中删除第三列(id2
),无论id2
值如何,我都可以查找重复项。清楚了吗?对于id==“A”
我得到TRUE
,因为第1行和第8行是相同的(并且具有不同的id2
)。我使用DT$var1[8]iiuc设置,如果id2
既有A
又有B
,那么您想检查是否有重复的c(var1,var2)
行?是这样吗?是否可以有多个重复,例如:第3行和第4行彼此相同?如果是这样,那么对于任何数量的重复项,该值是否仍然为真?在您的示例中,ID2值为“相同”的两行是相同的,不是吗?@Arun嗨,我正在寻找ID2==“A”
的行与ID2==“B”的任何其他行对于id
的每个值相等。显然排除了id2列,因此c(var1,var2)
需要匹配。在我的示例中,具有相同id2的第1行和第2行是相同的。是的,我想用它来模拟我的真实表格,但这种情况在结果中不起作用,事实上我使用了unique(.SD)
,然后我删除了第三列,即id2
。Michele,这很混乱,因为你说一切似乎都正常,但输出结果与你解释的结果不符,不是吗?我的意思是,如果id2==A
的var1
和var2
与id2==B
的var1
和var2
中的任何一个相同,那么它应该是真的。但是当id2==a时,你有一个真的。。。第一排和第二排。。你能解释一下我是不是出了什么问题吗?@Arun好的,当然。我希望相同的行对应不同的id2
值。如果存在具有相同id2
的相同行,则unique(.SD)
将丢弃这些行。然后从a
中删除第三列(id2
),无论id2
值如何,我都可以查找重复项。清楚了吗?对于id==“A”
我得到TRUE
,因为第1行和第8行是相同的(并且具有不同的id2
)。我使用DT$var1[8]设置它,我认为数据中的unique
。事实上,对于id
和id2
的每个组合,我都会得到一行。因此,对于所有级别的id
,我都会得到FALSE
。替换为unique.data.frame
会给出正确的结果,但这样大数据很可能会耗尽内存,不是吗?哦,是的,这个答案中没有DT
的key
设置。米歇尔,你有大量数据。要么你应该担心记忆力,要么你应该担心时间。但不是两者都有,我想:)。明白了!使用16 GB的RAM提高速度怎么样:))。无论如何,除了这个问题可以避免的内存问题外,更改为unique.data.frame
的速度非常慢(正如预期的那样),并且将键设置为您编码的所有4列的速度要快两倍以上。请参阅“稍后编辑”。@Michele,是的,这就是我现在正在测试的内容。我只想在这行前面加上setkey(DT)
,我想这是你能得到的最快的了……我认为数据中的unique
。事实上,对于id
和id2
的每个组合,我都会得到一行。因此,对于所有级别的id
,我都会得到FALSE
。替换为unique.data.frame
会给出正确的结果,但这样大数据很可能会耗尽内存,不是吗?哦,是的,这个答案中没有DT
的key
设置。米歇尔,你有大量数据。要么你应该担心记忆力,要么你应该担心时间。但不是两者都有,我想:)。明白了!那增量呢