如何使用ddply进行过滤

时间:2018-02-06 15:05:12

标签: r subset plyr

我有数据:

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输出中将此信息附加为新列。

  • 我考虑过只为数据参数的DF进行子集化,但这样做会消除可能的绘图年组合,这会使非子集和子集化输出中的相邻列更难(即使用{{1}之类的东西})。

有没有办法在ddply中使用一个或多个data.frame列中的值子集来对数据进行子集化?

更新:所需输出

merge()
  • 我知道这个输出将通过附加(cbinding)来自代码的2个独立变体的列来编译...

1 个答案:

答案 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