我有一个数据框,其中一些列包含的值非常少于0,我想删除这些列。
例如,如果我想在以下data.frame中删除少于5个值大于0的所有列,我该如何处理?
Name,Col1,Col2,Col3,Col4,Col5,Col6
Row1,0,0,0,0,10,400
Row2,125.0,2.50,0,0,5,0
Row3,10,0,0,10,100,70
Row4,10,0,50,0,0,10
Row5,489,0,30,0,35,50
Row6,0,0,450.5,0,10,400
Row7,125.5,0,2.50,0,0,5
Row8,10,0,0.50,10,100,70
Row9,10,0,50,0,0,10
Row10,489,0,0,0,35,50
答案 0 :(得分:4)
您可以尝试将colSums
与逻辑子集合并:
df1[, colSums(df1 > 0) >= 5]
# Col1 Col3 Col5 Col6
#Row1 0.0 0.0 10 400
#Row2 125.0 0.0 5 0
#Row3 10.0 0.0 100 70
#Row4 10.0 50.0 0 10
#Row5 489.0 30.0 35 50
#Row6 0.0 450.5 10 400
#Row7 125.5 2.5 0 5
#Row8 10.0 0.5 100 70
#Row9 10.0 50.0 0 10
#Row10 489.0 0.0 35 50
数据强>
df1 <- structure(list(Col1 = c(0, 125, 10, 10, 489, 0, 125.5, 10, 10,
489), Col2 = c(0, 2.5, 0, 0, 0, 0, 0, 0, 0, 0), Col3 = c(0, 0,
0, 50, 30, 450.5, 2.5, 0.5, 50, 0), Col4 = c(0L, 0L, 10L, 0L,
0L, 0L, 0L, 10L, 0L, 0L), Col5 = c(10L, 5L, 100L, 0L, 35L, 10L,
0L, 100L, 0L, 35L), Col6 = c(400L, 0L, 70L, 10L, 50L, 400L, 5L,
70L, 10L, 50L)), .Names = c("Col1", "Col2", "Col3", "Col4", "Col5",
"Col6"), class = "data.frame", row.names = c("Row1", "Row2",
"Row3", "Row4", "Row5", "Row6", "Row7", "Row8", "Row9", "Row10"))
答案 1 :(得分:1)
另一个选项是Filter
(使用来自@ RHertel&#39;帖子的数据)
Filter(function(x) sum(x>0)>=5, df1)
# Col1 Col3 Col5 Col6
#Row1 0.0 0.0 10 400
#Row2 125.0 0.0 5 0
#Row3 10.0 0.0 100 70
#Row4 10.0 50.0 0 10
#Row5 489.0 30.0 35 50
#Row6 0.0 450.5 10 400
#Row7 125.5 2.5 0 5
#Row8 10.0 0.5 100 70
#Row9 10.0 50.0 0 10
#Row10 489.0 0.0 35 50
答案 2 :(得分:0)
这应该有助于做你想要的。这会计算一列中的观察数量。
library(plyr)
count(dataframe, names(dataframe))
使用另一个人对df1的回答是。
count(df1, "Col1")
Col1 freq
1 0.0 2
2 10.0 4
3 125.0 1
4 125.5 1
5 489.0 2
要遍历列,请使用一些apply函数或for循环来获得所需的内容。
从这里,你只需要做一个&#34;如果&#34;声明检查freq&lt; = 5是否为0,并相应地删除它。