【发布时间】:2018-07-16 16:39:31
【问题描述】:
我有数据:
df<- data.frame(Plot = rep(rep(1:3,each = 2),3), Year = rep(1:3,each = 6),
D = rep(c(1,1,5,NA,2,2,2,1,5),2), HT = rep(c(NA,NA,NA,NA,3,2,NA,4,5),2))
Plot Year D HT
1 1 1 1 NA
2 1 1 1 NA
3 2 1 5 NA
4 2 1 NA NA
5 3 1 2 3
6 3 1 2 2
7 1 2 2 NA
8 1 2 1 4
9 2 2 5 5
10 2 2 1 NA
11 3 2 1 NA
12 3 2 5 NA
13 1 3 NA NA
14 1 3 2 3
15 2 3 2 2
16 2 3 2 NA
17 3 3 1 4
18 3 3 5 5
我知道在 plyr 包中使用 ddply() 可以让我计算每个情节年组合中存在的数量
ddply(df, .(df[,"Plot"], df[,"Year"]), nrow)
但是,我还想确定存在多少行考虑到HT 不是 NA(或者如果 D > 1)。我想将此信息作为新列附加到上面 ddply 的输出中。
- 我曾考虑只为 data 参数设置 DF 的子集,但这样做会消除可能的绘图年组合,这会使未子集和子集输出中的相邻列更加困难(即,使用类似
merge()的东西) .
有没有办法使用 data.frame 的一个或多个列中的值子集来对 ddply 中的数据进行子集化?
更新:期望的输出
Plot Year Count HaveHt
1 1 1 2 0
2 1 2 2 1
3 1 3 2 1
4 2 1 2 0
5 2 2 2 1
6 2 3 2 1
7 3 1 2 2
8 3 2 2 0
9 3 3 2 2
- 我了解此输出将通过附加(cbinding)列来自 2 个不同的代码变体...
【问题讨论】:
-
您可以使用
library(dplyr); df %>% group_by(Plot, Year) %>% mutate(n = sum(!is.na(HT)))或使用plyrplyr::ddply(df, c("Plot", "Year"), mutate, n = sum(!is.na(HT))) -
@Akrun,谢谢。但我想计算给定情节年组合的每个实例。
-
您是否可以显示预期的输出列。我不确定你想要什么
-
我想要类似于
ddply(df, .(df[,"Plot"], df[,"Year"]), nrow)的输出。我现在看到您包含了 n 列来获取我需要的信息。我只是被仍然出现在输出中的其他列(D 和 HT)分散了注意力 -
创建的
n列是plyr::ddply(df, c("Plot", "Year"), mutate, n = sum(!is.na(HT)))$n# [1] 1 1 1 2 2 2 2 2 2我希望这是你想要的