按月差异(dplyr,R)
假设我有一个如下所示的数据集。文本重复“a”到“e”,每个月都有值。时间为2016年1月至2016年3月按月差异(dplyr,R),r,dplyr,character,apply,lag,R,Dplyr,Character,Apply,Lag,假设我有一个如下所示的数据集。文本重复“a”到“e”,每个月都有值。时间为2016年1月至2016年3月 date text value 1-16 a 13 1-16 b 2 1-16 c 3 1-16 d 1 1-16 e 20 2-16 a 30 2-16 b 50 2-16 c 20 2-16 d 10 2-16
date text value
1-16 a 13
1-16 b 2
1-16 c 3
1-16 d 1
1-16 e 20
2-16 a 30
2-16 b 50
2-16 c 20
2-16 d 10
2-16 e 40
3-16 a 34
3-16 b 3
3-16 c 2
3-16 d 1
3-16 e 4
我想做一个列,它的值按月份和文本的不同而不同。我的意思是,17=(30(a,2-16)-13(a,1-16))像这样
date text value the value that I want to have
1-16 a 13 na
1-16 b 2 na
1-16 c 3 na
1-16 d 1 na
1-16 e 20 na
2-16 a 30 =(value(a, 2016-feb) - value(a, 2016-jan)) 17
2-16 b 50 =(value(b, 2016-feb) - value(b, 2016-jan)) 48
2-16 c 20 =(value(c, 2016-feb) - value(c, 2016-jan)) 17
2-16 d 10 =(value(d, 2016-feb) - value(d, 2016-jan)) 9
2-16 e 40 =(value(e, 2016-feb) - value(e, 2016-jan)) 20
3-16 a 34 =(value(a, 2016-mar) - value(a, 2016-feb)) 4
3-16 b 3 =(value(b, 2016-mar) - value(b, 2016-feb)) -47
3-16 c 2 =(value(c, 2016-mar) - value(c, 2016-feb)) -18
3-16 d 1 =(value(d, 2016-mar) - value(d, 2016-feb)) -9
3-16 e 4 =(value(e, 2016-mar) - value(e, 2016-feb)) -36
我做了上面的数据。实际数据更长,甚至更复杂,因为它每个月包含大约2000个文本,而且数据甚至没有日期。(它也被划分为许多类别)。因此,一些手动计算值的解决方案不起作用
例如,我尝试使用dplyr lag
df %>% group_by(date, text) %>%
arrange(date, text) %>%
mutate(diff = value - lag(value))
但它没有起作用。我想代码不能很好地识别文本
最好的方法是什么 带有
dplyr
library(dplyr)
df %>% group_by(text) %>% mutate(newval=c(NA,diff(value)))
date text value newval
<chr> <chr> <int> <int>
1 1-16 a 13 NA
2 1-16 b 2 NA
3 1-16 c 3 NA
4 1-16 d 1 NA
5 1-16 e 20 NA
6 2-16 a 30 17
7 2-16 b 50 48
8 2-16 c 20 17
9 2-16 d 10 9
10 2-16 e 40 20
11 3-16 a 34 4
12 3-16 b 3 -47
13 3-16 c 2 -18
14 3-16 d 1 -9
15 3-16 e 4 -36
库(dplyr)
df%>%分组依据(文本)%>%变异(newval=c(NA,差异(值)))
日期文本值newval
1-16 a 13 NA
2 1-16 b 2 NA
3 1-16 c 3 NA
4 1-16 d 1 NA
5 1-16 e 20 NA
6 2-16 a 30 17
7 2-16 b 50 48
8 2-16 c 20 17
9 2-16 d 10 9
10 2-16 e 40 20
11 3-16 a 34 4
12 3-16 b 3-47
13 3-16 c 2-18
14 3-16 d 1-9
15 3-16 e 4-36
或使用ave将其完全置于R基中
> df$newVal <- ave(df$value, df$text, FUN=function(x) c(NA,diff(x)))
> df
date text value newVal
1 1-16 a 13 NA
2 1-16 b 2 NA
3 1-16 c 3 NA
4 1-16 d 1 NA
5 1-16 e 20 NA
6 2-16 a 30 17
7 2-16 b 50 48
8 2-16 c 20 17
9 2-16 d 10 9
10 2-16 e 40 20
11 3-16 a 34 4
12 3-16 b 3 -47
13 3-16 c 2 -18
14 3-16 d 1 -9
15 3-16 e 4 -36
或者完全使用dplyr语法:df%>%groupby(text)%>%mutate(diff=value-lag(value))
。谢谢你的回复。我按照你的建议做了,有差异也有滞后。但是,制作一个只包含NA的新列是行不通的。我想文本可能不匹配?上面的例子看起来很简单,但实际数据包含大量文本,我假设无法计算值(滞后或差异),因为这些文本不匹配。如果是这种情况,你能给我一些建议吗?确保你的值列是数字-df$值设置为数字。但差异和滞后仍然只产生NA。当我尝试一些基本的计算,如+100,然后它运行良好。你知道为什么会这样吗?谢谢你的回复。正如你所说的,我很累,而且似乎很有效!但是,由于我有大量的数据集,我需要问一下,是否可以确定差值是按月计算的?也许这就是ave的工作原理?还有一件事要问,你能给我一些建议,如何将它应用于数据集中共享相同结构的多个组吗?我担心的是,如果使用dplyr,组之间的差异是否会混合,这是一个可以通过group_解决的问题。
df$newval <- c(aggregate(value ~ text, data=df, FUN=function(x) c(NA,diff(x)))[,-1])