我目前正在开发一个看起来像这样的数据框:
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)
在不使用任何包的情况下,我们可以使用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)
我意识到这个问题现在已经很老了,但是我遇到了这个问题,找到了另一个使用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)
| 归档时间: |
|
| 查看次数: |
3652 次 |
| 最近记录: |