根据值> 0的数据从R中的数据帧中删除列

时间:2016-03-22 19:28:04

标签: r dataframe

我有一个数据框,其中一些列包含的值非常少于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

3 个答案:

答案 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,并相应地删除它。