R 将函数应用于多个列表

R 将函数应用于多个列表,r,sapply,mapply,R,Sapply,Mapply,我试图在一个包含销售分类变量的数据框架上运行一些基本的统计数据(稍后还有更深入的统计数据)。除了销售,它还跟踪诸如区域(商户所在地)、一周中的哪一天、一天中的时间(午餐、下班后等)以及其他各种事情 这里是数据的一个小的随机子集:(注意,这是一个基本的表示——实际的数据框有38列——我只是去掉了大部分不适用的列) 我要做的第一件事是试图得到每个地区和每天每个时间的平均和中位数销售额。我想让R遍历每个值的列表并返回所有值。我试过这个: vallist<-list(a= c("Early AM"

我试图在一个包含销售分类变量的数据框架上运行一些基本的统计数据(稍后还有更深入的统计数据)。除了销售,它还跟踪诸如区域(商户所在地)、一周中的哪一天、一天中的时间(午餐、下班后等)以及其他各种事情

这里是数据的一个小的随机子集:(注意,这是一个基本的表示——实际的数据框有38列——我只是去掉了大部分不适用的列)

我要做的第一件事是试图得到每个地区和每天每个时间的平均和中位数销售额。我想让R遍历每个值的列表并返回所有值。我试过这个:

vallist<-list(a= c("Early AM", "Late AM", "Lunch", "MidAfternoon", "After Work", 
         "Evening", "Overnight"),
          b= c(1,2,3,4,5,6,7))

sapply(vallist[['b']], function(x)
    mapply(function(a,b) mean(data$totsales[which(data$timeofday==a & data$area==b)]),
          vallist[['a']], vallist[['b']])
 )
哪些是区域1的正确答案,但您可以看到每个区域的值相同。如何让R将函数应用于多个列表并返回所有值的组合


接下来的步骤将是应用中间值,并在地区级别和不同的工作日进行评估,但我认为相同的想法将适用于所有不同的组合。

对于这种特殊情况,您可以使用以下方法重现结果:

library(reshape2)
dcast(data[-1], timeofday ~ area, fun.aggregate=mean, fill=0)
产生:

     timeofday   1 2  3    4  5  6    7
1   After Work 0.0 0  0  0.0  0  0  2.0
2     Early AM 0.0 0  1  0.0  1  0  0.0
3      Evening 0.0 3 30 22.0  0  0  0.0
4      Late AM 0.0 0  0  5.5  1  0  0.0
5        Lunch 4.5 3  0  5.0 10  0  3.5
6 MidAfternoon 0.0 0  5  0.5 11 40 15.0

我敢肯定,与您的结果不符是因为您发布的数据是整体数据的子集。

将我的评论转换为答案

看起来您可能对聚合感兴趣(尽管在R中聚合数据有很多方法)


out您只是在寻找
aggregate
?类似于
aggregate(totsales~timeofday+区域、数据、平均值)
也许吧?是的,这确实有效。我有一种倾向,把事情弄得比R中需要的复杂得多。我想这是因为我是一个初学者。谢谢不过,作为将来的参考,我仍然有兴趣知道为什么上面的代码不能通读列表。@AnandaMahto,如果你时间安排得当,你应该就第50kt[r]个问题找到50K代表。这至少要值10万奖金。@datahappy,在你的
mapply
中将
vallist[['b']]]
更改为
x
,然后你会得到与我大致相同的结果(大概是因为你也需要na.rm)。谢谢。我知道这不需要它,但是你知道为什么上面的代码只应用了列表“b”中的第一个值吗?要让它像处理列表“a”一样循环处理列表“b”中的值1-7,需要做哪些更改?@datahappy,请参阅我对您的问题的最新评论。+1。如果他们对
aggregate
的回答是肯定的,我的另一个计划是什么。
library(reshape2)
dcast(data[-1], timeofday ~ area, fun.aggregate=mean, fill=0)
     timeofday   1 2  3    4  5  6    7
1   After Work 0.0 0  0  0.0  0  0  2.0
2     Early AM 0.0 0  1  0.0  1  0  0.0
3      Evening 0.0 3 30 22.0  0  0  0.0
4      Late AM 0.0 0  0  5.5  1  0  0.0
5        Lunch 4.5 3  0  5.0 10  0  3.5
6 MidAfternoon 0.0 0  5  0.5 11 40 15.0
out <- aggregate(totsales ~ timeofday + area, data, mean)
out
#       timeofday area totsales
# 1       Evening    1      0.0
# 2         Lunch    1      4.5
# 3  MidAfternoon    1      0.0
# 4       Evening    2      3.0
# 5         Lunch    2      3.0
# 6      Early AM    3      1.0
# 7       Evening    3     30.0
# 8  MidAfternoon    3      5.0
# 9       Evening    4     22.0
# 10      Late AM    4      5.5
# 11        Lunch    4      5.0
# 12 MidAfternoon    4      0.5
# 13     Early AM    5      1.0
# 14      Late AM    5      1.0
# 15        Lunch    5     10.0
# 16 MidAfternoon    5     11.0
# 17 MidAfternoon    6     40.0
# 18   After Work    7      2.0
# 19        Lunch    7      3.5
# 20 MidAfternoon    7     15.0