Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在具有data.table的子组中查找相同的行_R_Data.table - Fatal编程技术网

R 在具有data.table的子组中查找相同的行

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"),

我的桌子有两个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"), 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
设置。米歇尔,你有大量数据。要么你应该担心记忆力,要么你应该担心时间。但不是两者都有,我想:)。明白了!那增量呢