我有一个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
的所有行。
答案 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