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