使用 dplyr 的 mutate 函数对分组数据框中的 return 相对值
Using dplyr's mutate function to return relative values within a grouped data frame
我正在尝试使用 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
我查看了 "Hands on dplyr tutorial for faster data manipulation in R"(R-Bloggers),R-Studio 在 "The Grammar and Graphics of Data Science," 上的介绍,其中包含关于 dplyr 的附加信息,以及关于 dplyr 包和相关单元格引用的其他 Whosebug 问题一般,但我还没有找到解决这个问题的方法。作为记录,我也是 R 的新手,所以如果我忽略了一些对其他人来说非常明显的事情,我提前道歉。
尝试:
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() strips attributes
This is important when working with Dates and factors
因此我们需要在 ifelse 调用后恢复 class。
首先通过将 ifelse 更改为正确的调用来修复您的原始代码:
newqdat <- qdat %>% group_by(id) %>%
mutate(to_date = ifelse(fobs == 1,
as.Date("2013-12-31"),
as.Date(lead(from_date))))
然后将 class 改回日期:
class(newqdat$to_date) <- "Date"
newqdat
我正在尝试使用 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
我查看了 "Hands on dplyr tutorial for faster data manipulation in R"(R-Bloggers),R-Studio 在 "The Grammar and Graphics of Data Science," 上的介绍,其中包含关于 dplyr 的附加信息,以及关于 dplyr 包和相关单元格引用的其他 Whosebug 问题一般,但我还没有找到解决这个问题的方法。作为记录,我也是 R 的新手,所以如果我忽略了一些对其他人来说非常明显的事情,我提前道歉。
尝试:
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() strips attributes
This is important when working with Dates and factors
因此我们需要在 ifelse 调用后恢复 class。
首先通过将 ifelse 更改为正确的调用来修复您的原始代码:
newqdat <- qdat %>% group_by(id) %>%
mutate(to_date = ifelse(fobs == 1,
as.Date("2013-12-31"),
as.Date(lead(from_date))))
然后将 class 改回日期:
class(newqdat$to_date) <- "Date"
newqdat