R中的变量子串,然后由它分组

时间:2015-04-27 01:29:22

标签: r

我试图根据Jan的子字符串分组值Jan.05按月对某些数据进行分组,以便我可以确定每月平均值,并且我在解析和分组时遇到了心理障碍适当。

对于其他操作,我有几种形式的数据。

  • 原始数据:单行中5年值的项目
  • 整个数据集的重塑版本
  • 每个项目的子集数据

我最终想要做的是每种食品的每月平均价格。

这给了我每月相同的价值。

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

2 个答案:

答案 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
# ..        ...   ...   ...