我需要一些帮助来编写一个带有三个分类输入的函数,并根据这些输入返回一个摘要统计向量。
该数据集包含零售商品的信息,这些商品可以通过零售商品,商品名称,商品类型以及零售价格和实际销售价格来指定。
现在我需要编写一个能够接受这些输入并平均,计算和计算所需其他任何东西的函数。
我已按如下方式设置了该功能(使用补充数据):
dataold = data.frame(segment=c("golf","tenis","football","tenis","golf","golf"),
brand=c("x","y","z","y","x","a"),
type=c("iron","ball","helmet","shoe","driver","iron"),
retail=c(124,.60,80,75,150,108),
actual=c(112,.60,72,75,135,100))
retailsum = funtion(segment,brand,type){
datanew = dataold[which(dataold$segment='segment' &
dataold$brand='brand' &
dataold$type='type'),c("retail","actaul")]
summary = c(dim(datanew)[1],colMeans(datanew))
return(summary)
}
函数括号内的代码可以独立工作,但是一旦我将函数包装起来,我就会开始收到错误,或者只返回0
次计数和NaN
。
非常感谢任何帮助。我对R的经验很少,所以如果这是一个微不足道的问题我很抱歉,但我找不到解决方案。
答案 0 :(得分:7)
您的代码中存在很多错误,包括:
function
=
(赋值)而不是==
(相等测试)actual
segment
,brand
和type
进行硬编码,而不是引用参数。这是你的函数的样子,即它产生有效的结果:
retailsum <- function(data, segment,brand,type, FUN=colMeans){
x = with(data, data[segment==segment && brand==brand && type==type,
c("retail","actual")])
match.fun(FUN)(x)
}
retailsum(dataold, "golf", "x", "iron", colMeans)
retail actual
89.60000 82.43333
这是一个使用plyr
包的(可能更灵活)解决方案。这会计算您的细分,品牌和类型的所有组合的功能:
library(plyr)
ddply(dataold, .(segment, brand, type), colwise(mean))
segment brand type retail actual
1 football z helmet 80.0 72.0
2 golf a iron 108.0 100.0
3 golf x driver 150.0 135.0
4 golf x iron 124.0 112.0
5 tenis y ball 0.6 0.6
6 tenis y shoe 75.0 75.0
答案 1 :(得分:0)
Andrie的解决方案已经相当完整。 (ddply
很酷!不知道该功能......)
只需添加一个:如果您想计算所有可能组合的汇总值,您可以使用R的板载函数by
将其作为单行计算:
by(dataold, list(dataold$segment, dataold$brand, dataold$type),
function(x) summary(x[,c('retail', 'actual')])
)
这不是你要求的严格要求,但可能仍然具有指导意义。