计算数据帧的行零的百分比

时间:2020-03-11 15:43:27

标签: r

我需要计算数据帧中每一行的零百分比,并丢弃百分比高于给定阈值(60%)的行。我以为可以使用scales.xScale.bandwidth()将值添加为新变量,但是由于列数非常大,所以我仍然不知道如何首先计算它们。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

我们可以编写一个小函数来测试0的总和,然后apply()使用Base R删除所有所需的行:

## sampling data ##

set.seed(82)
df <- data.frame(a = sample(c(0,1,2,3), 10, replace = T), 
                 b = sample(c(0,1,2,3), 10, replace = T), 
                 c = sample(c(0,1,2,3), 10, replace = T),
                 d = sample(c(0,1,2,3), 10, replace = T), 
                 e = sample(c(0,1,2,3), 10, replace = T))

## function to find rows ##

row.discard <- function(vec, tresh = 0.1){
  t <- sum(vec == 0) / length(vec)
    if(t > tresh){
    T
    }
    else{
    F
    }
}

## apply to our df ##

ind <- apply(df, 1, row.discard)

## result ##

df[!ind,]

  a b c d e
1 3 2 2 3 2
5 2 1 1 2 1
6 1 2 3 3 3
7 1 3 3 1 2

注意:由于我们使用apply()来获取索引,因此没有将其应用于df本身,因此apply()所固有的向矩阵的转换不会使我们感到困扰。功能。

答案 1 :(得分:0)

使用apply函数,您可以每行传递一个函数,请求总和为0,然后除以总数,再乘以100,就可以得到百分比。

具有以下可重现的示例:

df <- data.frame(t(data.frame(Row1 = sample(c(1,0),20,replace = TRUE),
                              Row2 = sample(c(1,0),20,replace = TRUE))))

     X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20
Row1  1  1  0  0  1  0  0  0  1   1   1   1   0   1   1   1   1   1   0   0
Row2  0  0  1  0  0  0  0  1  1   0   1   1   0   0   1   1   1   0   1   0

您可以通过执行以下操作获得计数0和它们的表示形式为百分比:

# Count of 0
apply(df,1, function(x) sum(x == 0))

Row1 Row2 
   8   11

# Count of 0 expressed as percentage
apply(df,1, function(x) sum(x == 0)/ncol(df)*100)

Row1 Row2 
  40   55 

最后,如果您要提取百分比为0(假设高于41%)的行,则可以执行以下操作:

test <- apply(df,1, function(x) sum(x == 0)/ncol(df)*100)

df[test > 41,]
     X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20
Row2  0  0  1  0  0  0  0  1  1   0   1   1   0   0   1   1   1   0   1   0

它回答了您的问题吗?

答案 2 :(得分:0)

percent0 <- apply(myDF, 1, function (x) { sum(x==0) / length(x) })
myDF <- myDF[percent0 < 0.6,]