1

我有一个看起来像这样的数据。

Name|ID|p72|p78|p51|p49|c36.1|c32.1|c32.2|c36.2|c37
hsa-let-7a-5p|MIMAT0000062|9.1|38|12.7|185|8|4.53333333333333|17.9|23|63.3
hsa-let-7b-5p|MIMAT0000063|11.3|58.6|27.5|165.6|20.4|8.5|21|30.2|92.6
hsa-let-7c|MIMAT0000064|7.8|40.2|9.6|147.8|11.8|4.53333333333333|15.4|17.7|62.3
hsa-let-7d-5p|MIMAT0000065|4.53333333333333|27.7|13.4|158.1|8.5|4.53333333333333|14.2|13.5|50.5
hsa-let-7e-5p|MIMAT0000066|6.2|4.53333333333333|4.53333333333333|28|4.53333333333333|4.53333333333333|5.6|4.7|12.8
hsa-let-7f-5p|MIMAT0000067|4.53333333333333|4.53333333333333|4.53333333333333|78.2|4.53333333333333|4.53333333333333|6.8|4.53333333333333|8.9
hsa-miR-15a-5p|MIMAT0000068|4.53333333333333|70.3|10.3|147.6|4.53333333333333|4.53333333333333|21.1|30.2|100.8
hsa-miR-16-5p|MIMAT0000069|9.5|562.6|60.5|757|25.1|4.53333333333333|89.4|142.9|613.9
hsa-miR-17-5p|MIMAT0000070|10.5|71.6|27.4|335.1|6.3|10.1|51|51|187.1
hsa-miR-17-3p|MIMAT0000071|4.53333333333333|4.53333333333333|4.53333333333333|17.2|4.53333333333333|4.53333333333333|9.5|4.53333333333333|7.3
hsa-miR-18a-5p|MIMAT0000072|4.53333333333333|14.6|4.53333333333333|53.4|4.53333333333333|4.53333333333333|9.5|25.5|29.7
hsa-miR-19a-3p|MIMAT0000073|4.53333333333333|11.6|4.53333333333333|42.8|4.53333333333333|4.53333333333333|4.53333333333333|5.5|17.9
hsa-miR-19b-3p|MIMAT0000074|8.3|93.3|15.8|248.3|4.53333333333333|6.3|44.7|53.2|135
hsa-miR-20a-5p|MIMAT0000075|4.53333333333333|75.2|23.4|255.7|6.6|4.53333333333333|43.8|38|130.3
hsa-miR-21-5p|MIMAT0000076|6.2|19.7|18|299.5|6.8|4.53333333333333|49.9|68.5|48
hsa-miR-22-3p|MIMAT0000077|40.4|128.4|65.4|547.1|56.5|33.4|104.9|84.1|248.3
hsa-miR-23a-3p|MIMAT0000078|58.3|99.3|58.6|617.9|36.6|21.4|107.1|125.5|120.9
hsa-miR-24-1-5p|MIMAT0000079|4.53333333333333|4.53333333333333|4.53333333333333|9.2|4.53333333333333|4.53333333333333|4.53333333333333|4.9|4.53333333333333
hsa-miR-24-3p|MIMAT0000080|638.2|286.9|379.5|394.4|307.8|240.4|186|234.2|564

我想要做的是简单地选择所有值都大于 10 的行。但是为什么我的这个代码只报告最后一个?数据清楚地表明有更多的行满足这个条件。

> dat<-read.delim("http://dpaste.com/1215552/plain/",sep="|",na.strings="",header=TRUE,blank.lines.skip=TRUE,fill=FALSE)

但是为什么我的这段代码只报告最后一个呢?

> dat[apply(dat[, -1], MARGIN = 1, function(x) all(x > 10)), ]
            Name           ID   p72   p78   p51   p49 c36.1 c32.1 c32.2 c36.2 c37
19 hsa-miR-24-3p MIMAT0000080 638.2 286.9 379.5 394.4 307.8 240.4   186 234.2 564

正确的方法是什么?

更新: alexwhan 解决方案有效。但我想知道如何推广他的方法,以便它可以处理具有缺失值的数据(NA)

dat<-read.delim("http://dpaste.com/1215354/plain/",sep="\t",na.strings="",heade‌​r=FALSE,blank.lines.skip=TRUE,fill=FALSE) 
4

2 回答 2

1

由于您将ID列(这是一个因素)包含在 中all(),因此它变得一团糟。尝试:

dat[apply(dat[, -c(1,2)], MARGIN = 1, function(x) all(x > 10)), ]

#              Name           ID   p72   p78   p51   p49 c36.1 c32.1 c32.2 c36.2   c37
# 16  hsa-miR-22-3p MIMAT0000077  40.4 128.4  65.4 547.1  56.5  33.4 104.9  84.1 248.3
# 17 hsa-miR-23a-3p MIMAT0000078  58.3  99.3  58.6 617.9  36.6  21.4 107.1 125.5 120.9
# 19  hsa-miR-24-3p MIMAT0000080 638.2 286.9 379.5 394.4 307.8 240.4 186.0 234.2 564.0

编辑

对于你有的情况NA,你可以只使用na.rm参数 for all()。使用您的新数据(来自评论):

dat<-read.delim("http://dpaste.com/1215354/plain/",sep="\t",na.strings="",header=FALSE,blank.lines.skip=TRUE,fill=FALSE)
dat[apply(dat[, -c(1,2)], MARGIN = 1, function(x) all(x > 10, na.rm = T)), ]

#                V1           V2    V3    V4    V5    V6    V7    V8    V9   V10   V11
# 7  hsa-miR-15a-5p MIMAT0000068    NA  70.3  10.3 147.6    NA    NA  21.1  30.2 100.8
# 16  hsa-miR-22-3p MIMAT0000077  40.4 128.4  65.4 547.1  56.5  33.4 104.9  84.1 248.3
# 17 hsa-miR-23a-3p MIMAT0000078  58.3  99.3  58.6 617.9  36.6  21.4 107.1 125.5 120.9
# 19  hsa-miR-24-3p MIMAT0000080 638.2 286.9 379.5 394.4 307.8 240.4 186.0 234.2 564.0
# 20  hsa-miR-25-3p MIMAT0000081  19.3  78.6  25.6  84.3  14.9  16.9  19.1  27.2 113.8
# 21 hsa-miR-26a-5p MIMAT0000082    NA  22.8  31.0 561.2  12.4    NA  67.0  55.8  48.9
于 2013-06-07T02:27:13.060 回答
1

另一个想法是转换您的数据 ton long格式(或 molton 格式)。我认为最好避免以下方面的缺失值问题:

library(reshape2)
dat.m <- melt(dat,id.vars=c('Name','ID'))
dat.m$value <- as.numeric(dat.m$value)
library(plyr)
res <- ddply(dat.m,.(Name,ID), summarise, keepme = all(value > 10))
res[res$keepme,]
# Name           ID keepme
# 16  hsa-miR-22-3p MIMAT0000077   TRUE
# 17 hsa-miR-23a-3p MIMAT0000078   TRUE
# 19  hsa-miR-24-3p MIMAT0000080   TRUE
于 2013-06-07T03:06:34.493 回答