我有一个df:
df <- data.frame(genename = c("A","B","C","D"),
sample1 = c(10,0,50,0),
sample2 = c(0,30,0,70),
sample3 = c(50,0,0,30),
sample4 = c(0,0,0,10))
我想提取至少50%具有&gt; 0列的行 例如对于df基因名A和D符合要求
我已经为所有列做了这个
df2<-as.data.frame(df[apply(df ,MARGIN=1, function(x) all(x>0)),])
但我无法解决符合要求的列中的百分之几?
答案 0 :(得分:1)
使用基础R的解决方案:
df[apply(df[, -1], 1, function(x) sum(x > 0) / length(x)) > 0.5, ]
# genename sample1 sample2 sample3 sample4
#1 A 10 0 50 70
#4 D 0 70 30 10
说明:根据除{1}之外的所有列的>0
条目>50%
的百分比过滤行。
使用dplyr
的解决方案:
df %>% mutate(frac = rowSums(.[-1] > 0) / length(.[-1])) %>% filter(frac > 0.5)
# genename sample1 sample2 sample3 sample4 frac
#1 A 10 0 50 70 0.75
#4 D 0 70 30 10 0.75
答案 1 :(得分:0)
以下是一般解决方案:
df <- data.frame(genename = c("A","B","C","D"),
sample1 = c(0,10,0,0), sample2 = c(10,30,50,0), sample3=c(0,40,50,10), sample4=c(0,40,0,10))
df[(rowSums(df[-1]>0))>= (ncol(df[-1])/2),]
# genename sample1 sample2 sample3 sample4
# 2 B 10 30 40 40
# 3 C 0 50 50 0
# 4 D 0 0 10 10
这适用于第一列是您的基因名称的任何数据框,并且您希望其他列的50%或更多具有非零值。
这个逻辑如下:
从第二列开始获取数据框:df[-1]
,并将其转换为TRUE
的逻辑数据框,其中值大于0:df[-1]>0
。然后找出每行TRUE
中有多少列rowSums(df[-1]>0)
:nrow(df)
。这将返回长度为df
的向量,其值等于rowSums(df[-1]>0) >= ncol(df[-1])/2
对应行的每列中的非零值的数量。使用它来生成这些行的逻辑向量,其中至少一半的样本值大于0:df
,子集TRUE
按行来生成表达式7/3
的那些行
答案 2 :(得分:0)
试试这个:
df[
apply( df[, -1], 1, function(x) sum(x>0)/length(x) > 0.5 ) ,
]
genename sample1 sample2 sample3 sample4
1 A 10 0 50 70
4 D 0 70 30 10