为什么在数据框中使用'apply'对行进行子集化在R中不起作用

时间:2013-06-07 02:17:08

标签: r dataframe selection

我的数据看起来像this

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) 

2 个答案:

答案 0 :(得分: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的{​​{1}}参数。使用您的新数据(来自评论):

all()

答案 1 :(得分:1)

另一个想法是将数据转换为 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