【问题标题】:In large dataset, deleted selected dataset based on another small daseset [closed]在大数据集中,根据另一个小数据集删除选定的数据集[关闭]
【发布时间】:2013-09-05 14:33:09
【问题描述】:

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

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

【问题讨论】:

标签: r


【解决方案1】:

我假设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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这可能会删除比 OP 中要求的更多的重复项。
    【解决方案3】:
    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
    

    【讨论】:

    • 这可能会删除不重复的行...考虑这个例子:d1 &lt;- data.frame(a=2:1, b=1:2); d2 &lt;- data.frame(a=1:2, b=1:2); d1[!(d1$a %in% d2$a &amp; d1$b %in% d2$b),]
    【解决方案4】:

    要仅删除 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 的回答。

    【讨论】:

      猜你喜欢
      • 2019-06-12
      • 2019-06-17
      • 2019-01-17
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多