在同一数据帧中组合两个子组数据

时间:2015-05-10 13:00:06

标签: r dplyr

我有一个这样的数据框:

df = data.frame(time=c(2010:2015,2010:2015),
                variable=c(rep("a",6),rep("b",6)),
                value=c(rnorm(6),rnorm(6,mean=10)))

或:

   time variable      value 
1  2010        a -0.5472416
...
6  2015        a -0.2433123
7  2010        b  9.8617777
... 
12 2015        b  7.7674609

我需要创建一个新变量'c = a-b'。我发现的最佳解决方案是使用包'dplyr'和'tidyr':

df <- spread(df,variable,value) %>% 
      mutate(c=b-a) %>% 
      gather(variable,value,a:c) %>%
      filter(variable=="c")

给出了所要求的结果:

  time variable      value
1 2010        c  10.444794
2 2011        c   8.121627
...
6 2015        c  10.589378

是否有更直接的方法来获得相同的结果,这不需要先“传播”然后“收集”数据帧?

1 个答案:

答案 0 :(得分:3)

您可以使用group_bysummarize

c <- df %>%
    group_by(time) %>%
    summarize(value = diff(value))

请注意,这假设a位于数据框中的b之前。如果您不确定,可以在arrange(variable)之前添加group_by

如果一个变量的年份不是另一个变量(如jsFiddle中所示),则可以通过添加额外步骤来摆脱这些情况:

c <- df %>%
    group_by(time) %>%
    filter(n() == 2) %>%
    summarize(value = diff(value))