Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R dplyr/tidyr:“;突变;包含其他观测数据的新列_R_Dplyr_Tidyr - Fatal编程技术网

R dplyr/tidyr:“;突变;包含其他观测数据的新列

R dplyr/tidyr:“;突变;包含其他观测数据的新列,r,dplyr,tidyr,R,Dplyr,Tidyr,我正在尝试使用dplyr/tidyr函数创建两个新变量,方法是使用以前的相关行中的数据。在我的示例中,我有一个data.frame,其中包含ID、年份和金额的数据(见下文) 我想使用dplyr/tidyr动态创建最后两列(见下文)(我找到了一种定期创建的方法,但我想知道如何在dplyr/tidyr的最新版本中创建) 其中,YtY_方差通过从上一年减去金额获得,Y_方差通过从第一年减去金额获得(始终) 我希望代码如下所示: raw_data %>% group_by(

我正在尝试使用dplyr/tidyr函数创建两个新变量,方法是使用以前的相关行中的数据。在我的示例中,我有一个data.frame,其中包含ID、年份和金额的数据(见下文)

我想使用dplyr/tidyr动态创建最后两列(见下文)(我找到了一种定期创建的方法,但我想知道如何在dplyr/tidyr的最新版本中创建)

其中,YtY_方差通过从上一年减去金额获得,Y_方差通过从第一年减去金额获得(始终)

我希望代码如下所示:

    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))