根据条件删除多列

时间:2018-12-21 01:49:16

标签: r

我要确保该列至少有2个观察值大于0。如何删除只有一个观察值大于0的多个列;

Date     | Item1 | Item2 | Item3 | Item4
10/10/12 | 1     | 1     | 1     | 0
10/11/12 | 0     | 5     | 2     | 2
10/12/12 | 0     | 3     | 0     | 0
10/13/12 | 0     | 2     | 0     | 0
10/14/12 | 0     | 2     | 0     | 0

Item1列应从数据框中删除。

2 个答案:

答案 0 :(得分:0)

这是基本的R选项。我们可以使用apply来获取数据帧中每一列的非零计数。然后,我们可以在仅保留具有多个非零值的列的情况下对数据帧进行子集处理。

counts <- sapply(df, function(x) {
    sum(x > 0)
})

df[, counts > 1]

答案 1 :(得分:0)

我们可以使用colSums并保留至少两个大于0的值的列。我们在此处使用[-1]忽略Date列,并检查剩余列的大于0条件。

cbind(df[1], df[-1][colSums(df[-1] > 0) >= 2])

#      Date  Item2 Item3
#1 10/10/12      1     1
#2 10/11/12      5     2
#3 10/12/12      3     0
#4 10/13/12      2     0
#5 10/14/12      2     0

Item1Item4列被删除,因为它们两个都只有一个观察值大于0。


另一个选择是select_if中的dplyr使用相同的逻辑

library(dplyr)
bind_cols(df[1], df[-1] %>% select_if(funs(sum(. > 0) >= 2)))