使用dplyr删除所有列总和为零

Kaa*_*ant 10 r dplyr

我目前正在开发一个看起来像这样的数据框:

Site  Spp1  Spp2  Spp3  LOC  TYPE
S01   2     4     0     A    FLOOD
S02   4     0     0     A    REG
....
S10   0     1     0     B    FLOOD
S11   1     0     0     B    REG
Run Code Online (Sandbox Code Playgroud)

我正在尝试做的是数据框的子集,以便我可以在R中运行一些指标物种分析.

以下代码的工作原理是,我创建了两个数据子集,将它们合并为一个帧,然后删除未使用的因子级别

A.flood <- filter(data, TYPE == "FLOOD", LOC == "A")
B.flood <- filter(data, TYPE == "FLOOD", LOC == "B")
A.B.flood <- rbind(A.flood, B.flood) %>% droplevels.data.frame(A.B.flood, except = c("A", "B"))
Run Code Online (Sandbox Code Playgroud)

我也希望/需要做的是删除Spp总和为零的所有列(在我的真实数据集中有~60).有没有办法用dplyr实现这一点,如果有,是否可以将该代码传递到现有的A.B.flood数据帧代码?

谢谢!

编辑

通过仅选择总计为> 0的列,我设法删除了总和为零的所有列:

A.B.flood.subset <- A.B.flood[, apply(A.B.flood[1:(ncol(A.B.flood))], 2, sum)!=0]
Run Code Online (Sandbox Code Playgroud)

akr*_*run 6

在不使用任何包的情况下,我们可以使用rowSums'Spp'列(使用列的子集grep)和double negate,以便sum>0使用的行为TRUE而其他行为FALSE.使用此索引对行进行子集化.

data[!!rowSums(data[grep('Spp', names(data))]),]
Run Code Online (Sandbox Code Playgroud)

或者使用dplyr/magrittr我们select的'Spp'列,获取sum每一行Reduce,双重否定并使用extractfrom magrittr来将原始数据集与派生的索引进行子集化.

library(dplyr)
library(magrittr)
data %>%
    select(matches('^Spp')) %>%
    Reduce(`+`, .) %>%
    `!` %>%
    `!` %>%
     extract(data,.,)
Run Code Online (Sandbox Code Playgroud)

数据

data <- structure(list(Site = c("S01", "S02", "S03", "S04"), 
Spp1 = c(2L, 
4L, 0L, 4L), Spp2 = c(4L, 0L, 0L, 0L), Spp3 = c(0L, 0L, 0L, 0L
), LOC = c("A", "A", "A", "A"), TYPE = c("FLOOD", "REG", 
"FLOOD", 
"REG")), .Names = c("Site", "Spp1", "Spp2", "Spp3", "LOC", 
"TYPE"), class = "data.frame", row.names = c(NA, -4L))
Run Code Online (Sandbox Code Playgroud)


Whi*_*izz 5

我意识到这个问题现在已经很老了,但是我遇到了这个问题,找到了另一个使用dplyr的“选择”和“哪个”解决方案,对于dplyr的爱好者来说,这似乎更清楚:

A.B.flood.subset <- A.B.flood %>% select(which(!colSums(A.B.flood, na.rm=TRUE) %in% 0))
Run Code Online (Sandbox Code Playgroud)