我试图根据Jan
的子字符串分组值Jan.05
按月对某些数据进行分组,以便我可以确定每月平均值,并且我在解析和分组时遇到了心理障碍适当。
对于其他操作,我有几种形式的数据。
我最终想要做的是每种食品的每月平均价格。
这给了我每月相同的价值。
bcn_avg_prc <- ddply(bacon, .(substring(bacon$variable,1,3),value), summarise,
avg_price = mean(bacon$value, na.rm = FALSE))
所以我的问题是:
如何将其转换为一个月平均值的新数据表,因为我显然不能像对待整个集合那样执行
mean(data$variable)
,而不是按新子集合进行分组-string变量?
我希望的最终结果看起来像这样,我不关心它来自哪个数据集。
ItemA Jan 4.06
ItemB Jan 2.32
ItemC Jan 3.23
...
ItemA Feb 4.09
...
> head(steak)
Item variable value
3 Steak Jan.05 5.168
13 Steak Feb.05 5.258
23 Steak Mar.05 5.292
33 Steak Apr.05 5.390
43 Steak May.05 5.398
53 Steak Jun.05 5.272
> head(meat)
Item variable value
1 Ground Beef Jan.05 2.712
2 Beef Roast Jan.05 3.784
3 Steak Jan.05 5.168
4 Bacon Jan.05 3.367
5 PorkChops Jan.05 3.215
6 HAM Jan.05 2.242
> head(MeatPrice)
Item Jan.05 Feb.05 Mar.05 Apr.05 May.05 Jun.05 Jul.05 Aug.05 Sep.05
1 Ground Beef 2.712 2.754 2.759 2.775 2.752 2.735 2.719 2.715 2.731
2 Beef Roast 3.784 3.908 3.951 3.799 3.809 3.783 3.670 3.619 3.600
3 Steak 5.168 5.258 5.292 5.390 5.398 5.272 5.059 4.987 4.900
4 Bacon 3.367 3.395 3.355 3.331 3.560 3.457 3.478 3.442 3.404
5 PorkChops 3.215 3.180 3.200 3.209 3.232 3.306 3.271 3.280 3.254
6 HAM 2.242 2.253 2.273 2.350 2.335 2.301 2.323 2.304 2.358
答案 0 :(得分:3)
对于substring
/ substr
,您需要提供开始/结束位置:
substr('Jan.05', 1, 3)
# [1] "Jan"
在r:
中有很多方法可以进行拆分/应用/组合meat <- read.table(header = TRUE, text="Item variable value
1 GroundBeef Jan.05 2.712
2 BeefRoast Jan.05 3.784
3 Steak Jan.05 5.168
4 Bacon Jan.05 3.367
5 PorkChops Jan.05 3.215
6 HAM Jan.05 2.242")
meat$variable <- substr(meat$variable, 1, 3)
meat$avg <- with(meat, ave(value, list(Item, variable), FUN = mean))
aggregate(. ~ Item + variable, data = meat, mean)
by(meat, list(meat$Item, meat$variable), function(x) mean(x$value))
with(meat, tapply(value, list(Item, variable), mean))
因为您似乎正在使用ddply,所以可以这样做
library('plyr')
ddply(meat, .(Item, variable), summarise, avg = mean(value))
# Item variable value
# 1 Bacon Jan 3.367
# 2 BeefRoast Jan 3.784
# 3 GroundBeef Jan 2.712
# 4 HAM Jan 2.242
# 5 PorkChops Jan 3.215
# 6 Steak Jan 5.168
答案 1 :(得分:1)
我建议您,因为您已经在使用&#34; plyr&#34;,您可以考虑使用&#34; dplyr&#34;和&#34; tidyr&#34;做类似以下的事情:
library(dplyr)
library(tidyr)
meat %>%
separate(variable, into = c("Month", "Year")) %>%
group_by(Item, Month) %>%
summarise(value = mean(value))
实际上,如果你开始使用&#34; MeatPrice&#34;表,您可以使用以下内容完成所有操作:
MeatPrice %>%
gather(var, val, -Item) %>%
separate(var, into = c("Month", "Year")) %>%
group_by(Item, Month) %>%
summarise(val = mean(val))
# Source: local data frame [54 x 3]
# Groups: Item
#
# Item Month val
# 1 Bacon Apr 3.331
# 2 Bacon Aug 3.442
# 3 Bacon Feb 3.395
# 4 Bacon Jan 3.367
# 5 Bacon Jul 3.478
# 6 Bacon Jun 3.457
# 7 Bacon Mar 3.355
# 8 Bacon May 3.560
# 9 Bacon Sep 3.404
# 10 Beef Roast Apr 3.799
# .. ... ... ...