删除R data.table的行

时间:2016-01-02 21:45:17

标签: r data.table

我有一个data.table:

> dat
     Mutant       F1       F2       F3       F4       F5       F6       F7
  1:  A115D  6.53193  7.19020  8.45634  8.49147  9.28304 16.83618 10.70517
  2:  A115F  0.90377  4.33477  5.71287  6.63125  5.86933  9.41705 14.59203
  3:  A115G  3.26668  4.46146  5.42433  7.80924  8.52429 10.92138 11.27432
  4:  A115H  2.91278  5.09545  6.01828  8.18154  8.11368 11.98551 11.33009
  5:  A115I  9.35627  9.29640  9.78475 10.76222 12.80510 16.13456 16.51090
 ---                                                                      
313:   Y80R -1.19326 -2.05579 -1.16474  1.74387  4.79593  5.59487 11.35956
314:   Y80S -0.77282 -1.51611 -0.07168  3.16070  3.16795  7.73116 11.60527
315:   Y80T -0.16135 -0.05859  2.02493  3.28120  6.10268 11.71562 12.45665
316:   Y80V -0.24050 -0.59869  0.36746  3.07046  3.75905  9.17579 11.83179
317:   Y80W  0.77770 -0.10166  2.27790  6.11470  6.01080  9.47050 13.95344

我想删除F1 - F7列中任何一列的值大于10的所有行。

阅读小插图,我得到了

> dat[, .SD > 10, .SDcols=2:7]

虽然我不确定我是否在这里做了一件有意义的事情。无论如何,这给出了类似的东西:

> dat[, .SD>10, .SDcols=2:7]
        F1    F2    F3    F4    F5    F6   F7
[1,] FALSE FALSE FALSE FALSE FALSE  TRUE TRUE
[2,] FALSE FALSE FALSE FALSE FALSE FALSE TRUE
[3,] FALSE FALSE FALSE FALSE FALSE  TRUE TRUE
[4,] FALSE FALSE FALSE FALSE FALSE  TRUE TRUE
[5,] FALSE FALSE FALSE  TRUE  TRUE  TRUE TRUE
[6,] FALSE FALSE FALSE FALSE  TRUE  TRUE TRUE

现在,我想过滤掉任何条目为TRUE的所有行。

3 个答案:

答案 0 :(得分:2)

我们可以尝试

i1 <- setDT(dat)[, Reduce(`+`,lapply(.SD, ">", 10)), .SDcols=2:7]
i1
#[1] 1 0 1 1 3 0 0 1 0 0
dat[i1==0]

注意:注意到@nicola在评论中发布了类似的方法。我在编辑之前只看到了他原来的评论。

或使用

dat[-dat[ , .I[max(unlist(.SD))>10] ,by = 1:nrow(dat) , .SDcols= 2:7]$V1]
 #  Mutant       F1       F2       F3      F4      F5      F6       F7
 #1:  A115F  0.90377  4.33477  5.71287 6.63125 5.86933 9.41705 14.59203
 #2:   Y80R -1.19326 -2.05579 -1.16474 1.74387 4.79593 5.59487 11.35956
 #3:   Y80S -0.77282 -1.51611 -0.07168 3.16070 3.16795 7.73116 11.60527
 #4:   Y80V -0.24050 -0.59869  0.36746 3.07046 3.75905 9.17579 11.83179
 #5:   Y80W  0.77770 -0.10166  2.27790 6.11470 6.01080 9.47050 13.95344

答案 1 :(得分:2)

您可以使用

命令
dat[-which(rowSums(dat[,2:8]>10)>0),]

或TTMOTT指出

dat[-(rowSums(dat[,2:8]>10)>0),]

稍快一些     DAT [哪位(最大(DAT [,2:8])大于10),]

它基本上计算出有真实

的行

希望我没有弄错我的玩具示例:

 lines ="Mutant,F1,F2,F3,F4,F5,F6,F7
A115D,6.53193,7.19020,8.45634,8.49147,9.28304,16.83618,10.70517
A115F,0.90377,4.33477,5.71287,6.63125,5.86933,9.41705,14.59203
A115G,3.26668,4.46146,5.42433,7.80924,8.52429,10.92138,11.27432
A115H,2.91278,5.09545,6.01828,8.18154,8.11368,11.98551,11.33009
A115I,9.35627,9.29640,9.78475,10.76222,12.80510,16.13456,16.51090"

con <- textConnection(lines)
dat <- read.csv(con)
dat

dat[rowSums(dat[,2:7]>10)>0,]

答案 2 :(得分:0)

怎么样?

dat[-which(dat$F1>10 | dat$F2>10 | dat$F3>10 | dat$F4>10 | dat$F5>10 | dat$F6>10 | dat$F7>10)]

4项拟议解决方案的基准

dat <- data.frame("xxxxx", F1=runif(10000, 1,20),
                  F2=runif(10000, 1,20),
                  F3=runif(10000, 1,20),
                  F4=runif(10000, 1,20),
                  F5=runif(10000, 1,20),
                  F6=runif(10000, 1,20),
                  F7=runif(10000, 1,20))

benchmark(replications = 100, dat[-which(dat$F1>10 | dat$F2>10 | dat$F3>10 | 
                                      dat$F4>10 | dat$F5>10 | dat$F6> 10 | 
                                      dat$F7>10),],columns = c('elapsed'))
  elapsed
1    0.26

  benchmark(replications = 100, dat[(rowSums(dat[,2:8]>10)==0),],columns = c('elapsed'))

  elapsed
1    0.17

dat <- as.data.table(dat)

benchmark(replications = 100, dat[!(Reduce("|",dat[,lapply(.SD,function(x) x>10),.SDcols=2:8]))],
          columns = c('elapsed'))

  elapsed
1    0.32

benchmark(replications = 100, dat[-dat[ , .I[max(unlist(.SD))>10] ,by = 1:nrow(dat) , .SDcols= 2:8]$V1],
          columns = c('elapsed'))
  elapsed
1    6.05