【问题标题】:How to filter using ddply如何使用 ddply 进行过滤
【发布时间】: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 %&gt;% group_by(Plot, Year) %&gt;% mutate(n = sum(!is.na(HT))) 或使用plyr plyr::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 我希望这是你想要的

标签: r subset plyr


【解决方案1】:

如果我们使用plyr,则通过指定summarise 对列进行汇总,并在按列分组后得到逻辑向量的sum,即HT (!is.na(HT)) 的非NA 元素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

【讨论】:

  • 实际上我刚刚意识到这会吐出一个尺寸等于原始数据输入的data.frame。我希望将输出“缩小”到只包括按递增顺序排列的每个情节和年份组合(即,行将有前 2 列作为情节 1 年 1,p1y2,p1y3,p2y1,p2y2,...) .换句话说,具有重复情节年份组合的行将被删除
  • @theforestecologist 您能否在您的帖子中包含预期的输出。我不清楚
  • 很抱歉给您带来了困惑。我意识到我的示例不够完整,无法反映我的实际数据。我用新的示例数据集和所需输出的示例更新了我的帖子。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 2017-06-07
相关资源
最近更新 更多