0

我有一个像这样的大型数据集(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

4 回答 4

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
于 2013-09-02T13:25:15.767 回答
1

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

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

所以我建议先设置一个密钥,特别是如果 d1(或 d2)很大,并遵循 Roland 的回答。

于 2013-09-02T23:53:34.173 回答
1

您可以rbinddata.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

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

于 2013-09-02T13:32:47.487 回答
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
于 2013-09-02T13:36:28.330 回答