我有数据:
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
我了解在ddply()
包中使用plyr
可以让我计算每个情节组合中存在多少个
ddply(df, .(df[,"Plot"], df[,"Year"]), nrow)
但是,我还想确定存在多少行给出 HT不是NA(或者如果D> 1)。我想在上面的ddply输出中将此信息附加为新列。
有没有办法在ddply中使用一个或多个data.frame列中的值子集来对数据进行子集化?
更新:所需输出
merge()
答案 0 :(得分:1)
如果我们使用plyr
,则通过指定summarise
汇总列并获取逻辑向量的sum
,即HT的非NA元素(!is.na(HT)
)按列分组后,以及length
plyr::ddply(df, c("Plot", "Year"), summarise, n = length(HT), HaveHt = sum(!is.na(HT)))
dplyr
library(dplyr)
df %>%
group_by(Plot, Year) %>%
summarise(Count = n(), HaveHt = sum(!is.na(HT)))
# A tibble: 9 x 4
# Groups: Plot [?]
# Plot Year Count HaveHt
# <int> <int> <int> <int>
#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