簡體   English   中英

當少於一半的rowcells滿足條件時,過濾R中的行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM