R中变量的子字符串,然后按其分组

R中变量的子字符串,然后按其分组,r,R,例如,我试图根据Jan.05的子字符串分组值Jan按月对一些数据进行分组,这样我就可以确定月平均值,并且我在解析和适当分组数据时遇到了心理障碍 对于其他操作,我有两种形式的数据 原始数据:一行中具有5年值的项目 整个数据集的重塑版本 每个项目的子集数据 我最终想做的是每个食物的平均每月价格 这给了我每个月相同的值 bcn_avg_prc <- ddply(bacon, .(substring(bacon$variable,1,3),value), summarise,

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

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

  • 原始数据:一行中具有5年值的项目
  • 整个数据集的重塑版本
  • 每个项目的子集数据
我最终想做的是每个食物的平均每月价格

这给了我每个月相同的值

bcn_avg_prc <- ddply(bacon, .(substring(bacon$variable,1,3),value), summarise,
             avg_price = mean(bacon$value, na.rm = FALSE))

对于
子字符串
/
子字符串
,您需要给出起始/结束位置:

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))

对于
子字符串
/
子字符串
,您需要给出起始/结束位置:

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))

我建议你既然已经使用“PLYR”,你可以考虑“DPLYR”和“TiDyr”的组合来做如下的事情:

library(dplyr)
library(tidyr)

meat %>%
  separate(variable, into = c("Month", "Year")) %>%
  group_by(Item, Month) %>%
  summarise(value = mean(value))

事实上,如果您从“MeatPrice”表开始,您可以通过以下方式完成所有操作:

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

我建议你既然已经使用“PLYR”,你可以考虑“DPLYR”和“TiDyr”的组合来做如下的事情:

library(dplyr)
library(tidyr)

meat %>%
  separate(variable, into = c("Month", "Year")) %>%
  group_by(Item, Month) %>%
  summarise(value = mean(value))

事实上,如果您从“MeatPrice”表开始,您可以通过以下方式完成所有操作:

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

1) 对于子字符串,您需要给出开始和结束
子字符串(meat$variable,1,3)
,2)您要使用这些数据集中的哪一个?在你所期望的产出中,没有按年份分组,你只是按月份取平均值,而不考虑年份吗?@rawr是的,我不在乎产出中的年份。最终只是每个商品的月平均价格。就数据集而言,我不在乎哪一个是最简单的,因为这三个数据集中的任何一个都可以使用。@rawr,这很有帮助。。将问题编辑为仅关于使用子字符串进行分组。此问题涉及上述哪些数据集?实际上,我建议拆分变量,以便您仍然保留所有信息。您可能还希望以
Date
格式(请参见
?as.Date
)存储数据,从中可以更快地提取月份1)对于子字符串,您需要给出开始和结束
子字符串(meat$variable,1,3)
,2)您希望使用这些数据集中的哪一个?在你所期望的产出中,没有按年份分组,你只是按月份取平均值,而不考虑年份吗?@rawr是的,我不在乎产出中的年份。最终只是每个商品的月平均价格。就数据集而言,我不在乎哪一个是最简单的,因为这三个数据集中的任何一个都可以使用。@rawr,这很有帮助。。将问题编辑为仅关于使用子字符串进行分组。此问题涉及上述哪些数据集?实际上,我建议拆分变量,这样您仍然可以保留所有信息。您可能还希望将数据存储为
Date
格式(请参见
?as.Date
),从中提取月份会更快。我看第一个变量的效果如何,第二个变量计算平均值。。但是我还需要在ddply之后再做一步才能得到你得到的准确输出吗?@CRSouser哦,我错了,我忘了总结。我知道第一步效果很好,第二步计算平均值。。但是我还需要在ddply之后再做一步才能得到你得到的准确结果吗?@crouser哦,我错了,我忘了总结