提取符合过滤器R的列的百分比

时间:2018-03-26 03:48:35

标签: r

我有一个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)),])

但我无法解决符合要求的列中的百分之几?

3 个答案:

答案 0 :(得分:1)

方法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%的百分比过滤行。

方法2

使用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