在大型数据集中,根据另一个小数据集删除所选数据集

时间:2013-09-02 13:01:34

标签: r

我有一个像这样的大型数据集(d1)。

         SNP CHR       POS A1 A2     OR      P
       rs10   7  92221824  A  C 1.1008 0.2371
 rs1000000  12 125456933  G  A 0.9864 0.6714
 rs10000010   4  21227772  C  T 0.9710 0.2693
 rs10000012   4   1347325  G  C 1.0045 0.9087
 rs10000013   4  36901464  C  A 1.0198 0.5379
 rs10000017   4  84997149  T  C 0.9576 0.1912

我有一个像这样的小数据集(d2):

         SNP CHR       POS A1 A2     OR      P
 rs1000000  12 125456933  G  A 0.9864 0.6714
 rs10000017   4  84997149  T  C 0.9576 0.1912

现在,我想删除d1中包含d2信息的所有日期设置信息。结果应该是这样的:

         SNP CHR       POS A1 A2     OR      P
      rs10   7  92221824  A  C 1.1008 0.2371
 rs10000010   4  21227772  C  T 0.9710 0.2693
 rs10000012   4   1347325  G  C 1.0045 0.9087
 rs10000013   4  36901464  C  A 1.0198 0.5379

我尝试在这个网站上搜索看到类似的处理方法,但找不到答案。希望有人可以帮助我。非常感谢。

4 个答案:

答案 0 :(得分:2)

我认为SNP是唯一的密钥。

d1 <- read.table(text="SNP CHR       POS A1 A2     OR      P
rs10   7  92221824  A  C 1.1008 0.2371
rs1000000  12 125456933  G  A 0.9864 0.6714
rs10000010   4  21227772  C  T 0.9710 0.2693
rs10000012   4   1347325  G  C 1.0045 0.9087
rs10000013   4  36901464  C  A 1.0198 0.5379
rs10000017   4  84997149  T  C 0.9576 0.1912", header=TRUE, stringsAsFactors=FALSE)

d2 <- read.table(text="         SNP CHR       POS A1 A2     OR      P
 rs1000000  12 125456933  G  A 0.9864 0.6714
 rs10000017   4  84997149  T  C 0.9576 0.1912", header=TRUE, stringsAsFactors=FALSE)


library(data.table)

d1 <- data.table(d1, key="SNP")
d2 <- data.table(d2, key="SNP")

d1[!J(d2)]

#          SNP CHR      POS A1 A2     OR      P
#1:       rs10   7 92221824  A  C 1.1008 0.2371
#2: rs10000010   4 21227772  C  T 0.9710 0.2693
#3: rs10000012   4  1347325  G  C 1.0045 0.9087
#4: rs10000013   4 36901464  C  A 1.0198 0.5379

答案 1 :(得分:1)

您可以rbind data.frames然后找到重复项:

dx <- rbind(d1,d2)
dx[!(duplicated(dx)|rev(duplicated(dx[nrow(dx):1,]))),]
         SNP CHR      POS A1 A2     OR      P
1       rs10   7 92221824  A  C 1.1008 0.2371
3 rs10000010   4 21227772  C  T 0.9710 0.2693
4 rs10000012   4  1347325  G  C 1.0045 0.9087
5 rs10000013   4 36901464  C  A 1.0198 0.5379

请注意,您必须向前和向后扫描以检测所有非唯一元素。

答案 2 :(得分:1)

要仅删除d1中与d2中的某些行完全匹配的行,而不使用data.table且不假设任何列是键,则必须将每行与每隔一行进行比较,例如: / p>

d1[sapply(seq(nrow(d1)), function(i) all(sapply(seq(nrow(d2)), function(j) any(d1[i,]!=d2[j,])))),]

所以我建议先设置一个键,特别是如果d1(或d2)很大,请按照Roland的回答。

答案 3 :(得分:0)

mydata<-mtcars
mydata1<-mydata[1:10,1:4]
mydata2<-mydata[4:15,1:4]
mydata1[!(mydata1$mpg %in% mydata2$mpg & mydata1$cyl %in% mydata2$cyl & mydata1$disp %in% mydata2$disp & mydata1$hp %in% mydata2$hp) ,]
               mpg cyl disp  hp
Mazda RX4     21.0   6  160 110
Mazda RX4 Wag 21.0   6  160 110
Datsun 710    22.8   4  108  93