少于一半的行单元格满足条件时过滤R中的行

时间:2019-06-05 16:55:03

标签: r dataframe cell

我有一个包含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%的细胞是否符合标准,与平均值无关。

谢谢!

4 个答案:

答案 0 :(得分:0)

您可以使用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%的行中查找。

答案 1 :(得分:0)

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 , ]

您还可以创建逻辑向量,以子集或创建新的变量

# 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 , ]

答案 2 :(得分:0)

您可以使用

DF3[rowMeans(DF3[,1:20]) > 2 )>0.5, ]

答案 3 :(得分:0)

谢谢,我已经对一些答案进行了调整,最终我用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),]