我有一个这样的数据框:
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
是否有更直接的方法来获得相同的结果,这不需要先“传播”然后“收集”数据帧?
答案 0 :(得分:3)
您可以使用group_by
和summarize
:
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))