【问题标题】:Using dplyr's mutate function to return relative values within a grouped data frame使用 dplyr 的 mutate 函数返回分组数据框中的相对值
【发布时间】:2015-07-14 21:50:15
【问题描述】:

我正在尝试使用 dplyr 的 mutate 函数来创建一个新变量,该变量根据 ifelse 语句的值提取现有变量的相对值。这是我正在尝试实现的示例,希望能更好地说明问题:

id  from_date fobs     to_date
 a 1999-01-05    0  1999-01-10
 a 1999-01-10    0  1999-02-14
 a 1999-02-14    1  2013-12-31
 b 1999-03-19    0  1999-03-25
 b 1999-03-25    1  2013-12-31
 c 1999-02-14    0  1999-02-15
 c 1999-02-15    1  2013-12-31

数据集按 ID 分组,我试图为“to_date”的每个观察值分配下一个观察值的起始日期,其中“fobs”的值等于 0,以及 2013-12- 31,其中值等于 1。

这是我最近尝试的代码,它对我不起作用,但我希望充分表达我想要通过 dplyr 包完成的工作:

qdat %>% group_by(id) %>% mutate(to_date = ifelse(fobs == 1,as.Date("2013-12-31"),as.Date(lead(qdat$date)))) 

不管怎样,这些是运行该代码的结果:

  id  from_date val fobs to_date
1  a 1999-01-05   5    0      NA
2  a 1999-01-10   9    0      NA
3  a 1999-02-14   4    1   16070
4  b 1999-03-19   7    0      NA
5  b 1999-03-25  14    1   16070
6  c 1999-02-14  10    0      NA
7  c 1999-02-15  11    1   16070

我已经查看了“在 R 中更快地进行数据操作的 dplyr 上手教程”(R-Bloggers)、R-Studio 关于“数据科学的语法和图形”的演示文稿,其中包含有关 dplyr 的更多信息,以及其他 stackoverflow一般关于 dplyr 包和相关单元格引用的问题,但我还没有找到解决这个问题的方法。为了记录,我对 R 也很陌生,所以如果我忽略了一些对其他人来说似乎非常明显的东西,我提前道歉。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    试试:

    library(dplyr)
    
    qdat %>% group_by(id) %>%
             mutate(to_date = lead(from_date, default = as.Date("2013-12-31")))
    

    您可以取出 ifelse,因为在您的示例中,最后一个将始终是默认值。如果没有,请参见下文。

    您可能必须先运行qdat$from_date <- as.Date(qdat$from_date)

    注意:你得到这个结果是因为 ifelse 的一个奇怪的事情。来自 ?ifelse:

    ifelse() 去除属性

    这在使用日期和因素时很重要

    所以我们需要在 ifelse 调用后恢复类。

    首先通过将 ifelse 更改为正确的调用来修复您的原始代码:

    newqdat <- qdat %>% group_by(id) %>%
                        mutate(to_date = ifelse(fobs == 1,
                                                as.Date("2013-12-31"),
                                                as.Date(lead(from_date))))
    

    然后将类改回最新:

    class(newqdat$to_date) <- "Date"
    newqdat
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 2015-08-13
      • 2014-11-29
      • 1970-01-01
      • 2022-06-13
      相关资源
      最近更新 更多