[英]Filtering rows in R when less than half rowcells meet a condition
我有一个包含276列样本和215000行的矩阵。 值的范围从零到一些非负值。
我将使用mtcars作为简化示例
我需要过滤出少于50%(可能是任何百分比)样本未达到特定值的行,例如1。
示例矩阵:
Tmtcars <- t(mtcars[1:5,c(2, 8:11)])
我需要选择至少50%的单元格等于或大于1的行。
只有行“vs = c(0,0,1,1,0)”不符合此条件。 因为只有2个细胞(40%)是1或更大。
应选择行“am = c(1,1,1,0,0)”,因为3个单元(60%)等于或大于1。
如果我运行rowMeans函数
Filtered <- Tmtcars[(rowMeans(Tmtcars) >= 1 ) >=0.5, ]
未选中“am”行。
选择标准必须是50%的细胞是否符合标准,与平均值无关。
谢谢!
您可以使用rowSums()
:
set.seed(1)
sample1 <- c(sample(1:10, 5))
sample2 <- c(sample(1:10, 5))
sample3 <- c(sample(1:10, 5))
sample4 <- c(sample(1:10, 5))
sample5 <- c(sample(1:10, 5))
df <- data.frame(sample1, sample2, sample3, sample4, sample5)
df2 <- df[rowSums(df > 2) > (ncol(df)/2),]
你显然可以玩这些价值观。 前2
是要比较的值,第二2
是查找比较匹配超过50%的行。
True / False参数在R中具有数值。
TRUE + TRUE ; FALSE + FALSE ; FALSE + TRUE
您可以使用此功能和总和来选择多个行
sum( 5 == c( 3, 5, 5, 2))
您可以像这样对行进行子集化。 当条件为真时超过5次,比我们基于条件的子集
if( sum( mtcars$mpg >20 ) > 5 ) mtcars[ mtcars$mpg >20 , ]
您还可以创建逻辑向量,子集或创建新的var
# more than five times - mpg greater than 20
rows <- rep(sum( mtcars$mpg >20 ) > 5, nrow( mtcars)) & mtcars$mpg >20
# more than 25 times
rowshigher <- rep(sum( mtcars$mpg >20 ) > 25, nrow( mtcars)) & mtcars$mpg >20
mtcars[ rows , ]
在你的情况下,你可以做到
DF3[rowMeans(DF3[,1:20]) > 2 )>0.5, ]
谢谢,我已经调整了一些答案,最后有3种方法可以给我相同的结果
F1 <- Tmtcars[rowSums(Tmtcars >= 1) >= (ncol(Tmtcars)/2), ]
F1b <- Tmtcars[rowMeans(Tmtcars >= 1) >= 0.5, ]
F2 <- Tmtcars[apply(Tmtcars, 1, function(x) mean(x>=1)>=0.5),]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.