R dplyr/tidyr:“;突变;包含其他观测数据的新列
我正在尝试使用dplyr/tidyr函数创建两个新变量,方法是使用以前的相关行中的数据。在我的示例中,我有一个data.frame,其中包含ID、年份和金额的数据(见下文) 我想使用dplyr/tidyr动态创建最后两列(见下文)(我找到了一种定期创建的方法,但我想知道如何在dplyr/tidyr的最新版本中创建) 其中,YtY_方差通过从上一年减去金额获得,Y_方差通过从第一年减去金额获得(始终) 我希望代码如下所示:R dplyr/tidyr:“;突变;包含其他观测数据的新列,r,dplyr,tidyr,R,Dplyr,Tidyr,我正在尝试使用dplyr/tidyr函数创建两个新变量,方法是使用以前的相关行中的数据。在我的示例中,我有一个data.frame,其中包含ID、年份和金额的数据(见下文) 我想使用dplyr/tidyr动态创建最后两列(见下文)(我找到了一种定期创建的方法,但我想知道如何在dplyr/tidyr的最新版本中创建) 其中,YtY_方差通过从上一年减去金额获得,Y_方差通过从第一年减去金额获得(始终) 我希望代码如下所示: raw_data %>% group_by(
raw_data %>%
group_by(ID, YEAR) # Not even sure if that's required?!?
mutate(YtY_VARIANCE = xxx(), Y_VARIANCE = yyy() )
xxx和yyy应该是什么?!这可能吗
有人能告诉我或给我指出答案吗
提前谢谢 你可以试试
raw_data %>%
group_by(ID) %>%
mutate(YtY_VARIANCE=AMOUNT-lag(AMOUNT),
YtY_VARIANCE=replace(YtY_VARIANCE, which(is.na(YtY_VARIANCE)), 0),
Y_VARIANCE=AMOUNT-AMOUNT[1L])
# ID YEAR AMOUNT YtY_VARIANCE Y_VARIANCE
#1 A 2000 4 0 0
#2 B 2000 4 0 0
#3 A 2001 2 -2 -2
#4 B 2001 3 -1 -1
#5 A 2002 3 1 -1
#6 B 2002 1 -2 -3
谢谢Matthew和Akrun!有了你的两种解决方案,我终于找到了最终的解决方案 Akrun建议的解决方案在我的简单模型中有效,但在我的更大/复杂/最终模型中仍然存在问题。我最终的解决方案是将两者结合起来:
raw_data %>%
group_by(ID) %>%
arrange(YEAR) %>%
mutate(YtY_VARIANCE=AMOUNT-lag(AMOUNT),
YtY_VARIANCE=replace(YtY_VARIANCE, which(is.na(YtY_VARIANCE)), 0),
Y_VARIANCE=AMOUNT-first(AMOUNT))
谢谢你的帮助!希望它能帮助其他人 加一。你也可以做
YtY\u VARIANCE=pmax(AMOUNT lag(AMOUNT),0,na.rm=TRUE)
和Y\u VARIANCE=AMOUNT first(AMOUNT)
@matthewPlourd谢谢,我尝试了pmax
行,但它给出了[1]0 0 0 0 0 1 0
我正在使用的dplyr\u 0.4.1.9000
raw_data %>%
group_by(ID) %>%
mutate(YtY_VARIANCE=AMOUNT-lag(AMOUNT),
YtY_VARIANCE=replace(YtY_VARIANCE, which(is.na(YtY_VARIANCE)), 0),
Y_VARIANCE=AMOUNT-AMOUNT[1L])
# ID YEAR AMOUNT YtY_VARIANCE Y_VARIANCE
#1 A 2000 4 0 0
#2 B 2000 4 0 0
#3 A 2001 2 -2 -2
#4 B 2001 3 -1 -1
#5 A 2002 3 1 -1
#6 B 2002 1 -2 -3
raw_data %>%
group_by(ID) %>%
arrange(YEAR) %>%
mutate(YtY_VARIANCE=AMOUNT-lag(AMOUNT),
YtY_VARIANCE=replace(YtY_VARIANCE, which(is.na(YtY_VARIANCE)), 0),
Y_VARIANCE=AMOUNT-first(AMOUNT))