【问题标题】:Unexpected dply() output. Not grouping as desired意外的 dply() 输出。未按需要分组
【发布时间】:2021-12-21 15:35:04
【问题描述】:

我是一名 R 新手,用来尝试分析植物物种的一些人口统计数据。我的数据框包括:

TagKey(唯一标识符)、Year(观察年份)、TagEstablished(首次发现植物的年份)和 StageClass(0=死亡,1=幼苗,2=植物,3=繁殖)。每年参观工厂都有一行,但我想要每株植物 1 行,然后是每年的状态列。这是为了逐年跟踪个人的状态。

示例数据:

TagKey <- c(PDPLM040J0_ALIFOR01_Belt_0, PDPLM040J0_ALIFOR01_Belt_0, PDPLM040J0_ALIFOR01_Belt_0, PDPLM040J0_ALIFOR01_Belt_1, PDPLM040J0_ALIFOR01_Belt_1, PDPLM040J0_ALIFOR01_Belt_1)
Year <- c(2020, 2020, 2020, 2021, 2021, 2021)
TagEstablished <- c(2020, 2020, 2020, 2020, 2020, 2020)
StageClass <- c(1, 2, 3, 0, 3, 3)

ALFO_stages <- data.frame(TagKey, Year, TagEstablished, StageClass)

我尝试使用 ddply:

ALFO_status <- ddply(ALFO_stages, .(TagKey), dplyr::summarize,
                     Year_Established = TagEstablished,
                     Status2020 = if(Year=="2020") {StageClass},
                     Status2021 = if(Year=="2021") {StageClass})

我的输出没有按需要按 TagKey 分组。输出对于它们各自的年份是正确的,但不适用的年份只是吐出 NA。帮忙?

【问题讨论】:

  • Few cmets:请尝试使用dput 获取您的样本数据,并提供生成此样本数据的 R 代码。其次,plyr 已经退休了,所以现在接起来也不是最好的办法。 dplyr 是当前标准。第三,你到底想做什么?
  • 感谢您的意见。 Simon.S.A 在下面解决了我的问题。

标签: r dplyr plyr demographics


【解决方案1】:

基于这句话:“植物被访问的每一年都有一行,但我希望每株植物有 1 行,然后是每年的状态列。”听起来您想要的是重塑或旋转您的数据。

“分组依据”往往是汇总数据的一部分。例如。计算每年的记录数量,将涉及按年份分组。旋转或重塑是将列内容转换为列标签的过程,反之亦然。

在 R 中,我会推荐 tidyr 包。可能是这样的:

TagKey <- c("PDPLM040J0_ALIFOR01_Belt_0", "PDPLM040J0_ALIFOR01_Belt_0", "PDPLM040J0_ALIFOR01_Belt_0", "PDPLM040J0_ALIFOR01_Belt_1", "PDPLM040J0_ALIFOR01_Belt_1", "PDPLM040J0_ALIFOR01_Belt_1")
Year <- c(2018, 2019, 2020, 2019, 2020, 2021) # NOTE editted for unique year for each tree
TagEstablished <- c(2020, 2020, 2020, 2020, 2020, 2020)
StageClass <- c(1, 2, 3, 0, 3, 3)

ALFO_stages <- data.frame(TagKey, Year, TagEstablished, StageClass)

library(tidyr)
library(dplyr)

ALFO_stages %>% pivot_wider(id_cols = c(TagKey, TagEstablished), names_from = Year, values_from = StageClass)

这会产生:

   TagKey                     TagEstablished `2018` `2019` `2020` `2021`
  <chr>                               <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1 PDPLM040J0_ALIFOR01_Belt_0           2020      1      2      3     NA
2 PDPLM040J0_ALIFOR01_Belt_1           2020     NA      0      3      3

或者,您可以使用大量 ifelse 语句手动执行此操作:

ALFO_stages %>%
  group_by(TagKey, TagEstablished) %>%
  summarise(y2018 = max(ifelse(Year == 2018, StageClass, NA), na.rm = TRUE),
            y2019 = max(ifelse(Year == 2019, StageClass, NA), na.rm = TRUE),
            y2020 = max(ifelse(Year == 2020, StageClass, NA), na.rm = TRUE),
            y2021 = max(ifelse(Year == 2021, StageClass, NA), na.rm = TRUE))

这两段代码产生相同的答案(但对缺失值的 NA 处理方式不同)。

【讨论】:

    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    相关资源
    最近更新 更多