为什么要用';应用';在数据帧中不';我不能在R工作
我有一个数据,看起来像 我想做的是简单地选择所有值都大于10的行。 但为什么我的代码只报告最后一个? 数据清楚地表明,满足此条件的行更多为什么要用';应用';在数据帧中不';我不能在R工作,r,dataframe,selection,R,Dataframe,Selection,我有一个数据,看起来像 我想做的是简单地选择所有值都大于10的行。 但为什么我的代码只报告最后一个? 数据清楚地表明,满足此条件的行更多 > dat<-read.delim("http://dpaste.com/1215552/plain/",sep="|",na.strings="",header=TRUE,blank.lines.skip=TRUE,fill=FALSE) 正确的方法是什么 更新: alexwhan的解决方案有效。但我想知道我怎样才能概括他的方法 以便它可以处理
> dat<-read.delim("http://dpaste.com/1215552/plain/",sep="|",na.strings="",header=TRUE,blank.lines.skip=TRUE,fill=FALSE)
正确的方法是什么
更新:
alexwhan的解决方案有效。但我想知道我怎样才能概括他的方法
以便它可以处理缺少值的数据(NA)
dat既然你在all()
中包含了你的ID
列(这是一个因素),它就变得一团糟了。尝试:
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
的情况,只需使用all()
的NA.rm
参数即可。使用您的新数据(来自评论):
dat 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 21.1 30.2 100.8
#16 hsa-miR-22-3p MIMAT000077 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 MIMAT000080638.2286.9379.5394.4307.8240.4186.0234.2564.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
另一个想法是将数据转换为长格式(或莫尔顿格式)。我认为更好的做法是避免以下方面的值缺失问题:
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
library(重塑2)
非常感谢。它起作用了。但是,我如何推广您的方法,使其能够处理缺少值的数据呢<代码>dat@neversaint查看编辑是否适合您。对于您的第一个示例,我无法理解为什么dat[,19]
返回TRUE
,这似乎很奇怪。可能值得一个单独的问题我想这取决于OP是否希望NA
导致逻辑测试失败-只是意识到问题中不清楚。如果你有NA,那么。。。全部(x[!is.na(x)]>10))
BTW。。。“不起作用”太模糊了,没有意义。它应该从计算机相关的话语中删除。
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)), ]
# 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
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
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