我有一个名为data的数据框。我使用split函数通过名为KEY的属性拆分数据。
data <- split(data, data$KEY);
通过KEY拆分数据框后,我们得到的是各个公司的数据。数据框数据包含了宇宙中所有公司的数据。拆分后,每个拆分都有两列,年份和销售额。对于每次拆分,我必须计算与每年相对应的增量销售额。例如,如果我们有2002 - 10年,2003年 - 12年,2004年 - 15年,2005年 - 20年的数据。对于每次拆分,我感兴趣的是2003-2,2004-3,2005-5。 我编写了一个名为mod_sale的函数来执行上述工作:
data[with(data, order(year)),];
sale_data <- diff(data$SALE);
data <- data[-1,];
data$SALE <- sale_data;
return(data)
目前,我正在使用for循环:
for(key in names(data)){
a <- try(mod_sale(data[[key]]))
if(class(a) == "try-error") next;
mod_data <- rbind(mod_data,a)};
我认为有一些方法,我可以使用sapply(也可能是plyr)。有人可以帮我改进这个R代码吗?不确定代码会有多么流畅。
sapply(data, mod_sale)
任何帮助将不胜感激。感谢。
编辑:
这是一个数据示例:
a <- data.frame();
key <- c(1,1,1,1,2,2,2,2,2,3,3,3);
sales <- c(12,12,15,8,3,6,3,9,9,12,3,7);
year <- c(2002,2003,2004,2005,2001,2002,2003,2004,2005,2003,2004,2005);
ovar <- runif(12,5.0,7.5);
a <- data.frame(key,sales,year,ovar)
在生成的data.frame中,我期待增量销售而非实际销售。显然,3键会丢失3个数据点;每个起始年一个,因为我们正在发挥作用。因此,结果data.frame中将减少三行,其中包含列键,差异(销售额),年份和ovar。
答案 0 :(得分:2)
这就是我要做的事情:
a$diffsales <- ave( a$sales, a$key, FUN=function(x) c(NA, diff(x) ) )
a
key sales year ovar diffsales
1 1 12 2002 6.845177 NA
2 1 12 2003 6.328153 0
3 1 15 2004 6.872669 3
4 1 8 2005 6.098920 -7
5 2 3 2001 7.154824 NA
6 2 6 2002 6.110810 3
7 2 3 2003 5.906624 -3
8 2 9 2004 5.214369 6
9 2 9 2005 5.818218 0
10 3 12 2003 5.354354 NA
11 3 3 2004 6.728992 -9
12 3 7 2005 7.412213 4
答案 1 :(得分:1)
我很欣赏尝试展示您尝试过的内容。谢谢。
将来,尝试提供一个小例子,如下:
df <- data.frame(year = 2001:2010,
sale = sample(20,10))
df <- rbind(df,df,df)
df$key <- rep(letters[1:3],each = 10)
这样可以更清楚地了解您的数据是什么样的,并且它使得非常很容易让人们尝试回答。你越容易为我们做,你会得到更快更好的答案。
我建议在拆分之前进行排序:
#Sort first (already sorted, but you get the idea)
df <- df[order(df$key,df$year),]
df_split <- split(df,df$key)
您实际上并不想使用sapply
。 (试试看看。)你只想要lapply
:
out <- lapply(df_split,function(x) {x$sale_diff <- c(NA,diff(x$sale)); x[-1,]})
你可以使用以下方法将它们全部组合在一起:
do.call(rbind,out)
你是对的, plyr 或data.table
也可以这样做。我会将这些例子留给其他人。
答案 2 :(得分:1)
使用data.table
:
library(data.table)
dt = data.table(a)
dt[, sale_diff := c(NA, diff(sales)), by = key]
dt
# key sales year ovar sale_diff
# 1: 1 12 2002 7.416857 NA
# 2: 1 12 2003 5.625818 0
# 3: 1 15 2004 5.018934 3
# 4: 1 8 2005 6.671986 -7
# 5: 2 3 2001 6.242739 NA
# 6: 2 6 2002 6.297763 3
# 7: 2 3 2003 6.482124 -3
# 8: 2 9 2004 6.724256 6
# 9: 2 9 2005 5.071265 0
#10: 3 12 2003 6.136681 NA
#11: 3 3 2004 6.974392 -9
#12: 3 7 2005 6.517553 4