将变量名传递给mapply(使用重塑)

时间:2015-08-10 18:58:13

标签: r mapply

我试图采用长格式数据帧,并根据不同变量列表从中创建多个宽格式数据帧。

我的想法是使用 mapply 来传递我想要按位置过滤到数据集的变量集。但它看起来像mapply可以在vars列表中读取。

数据:

library(dplyr)
library(reshape2)

set.seed(1234)
data <- data.frame(
    region = sample(c("northeast","midwest","west"), 40, replace = TRUE),
    date = rep(seq(as.Date("2010-02-01"), length=4, by = "1 day"),10),
    employed = sample(50000:100000, 40, replace = T),
    girls = sample(1:40),
    guys = sample(1:40)
)

对于每个定量变量(就业,女孩和家伙),我想创建一个宽格式数据框,其中日期为行,区域为列。

我是否可以使用mapply更简洁地执行此操作,而不是分别为{&#34;雇用&#34;,&#34;女孩&#34;,&#34;伙伴&#34;}分别运行融合和dcast?

例如:

mapply(function(d,y) {melt(d[,c('region','date',y)], id.vars=c('region','date'))},
    data,
    c('employed','girls','guys')
    )

告诉我:

>Error in `[.default`(d, , c("region", "date", y)) : 
  incorrect number of dimensions

我希望获得的是宽幅数据帧的列表;我认为mapply是传递多个参数的最简单方法,但如果有更好的方法可以解决这个问题,那我就是全部。

示例:

$employed
        date midwest northeast   west
1 2010-02-01   62196    513366 119070
2 2010-02-02  334849    271383 160552
3 2010-02-03  187070    320594 119721
4 2010-02-04  146575    311999 310009

$girls
        date midwest northeast west
1 2010-02-01      40       154   26
2 2010-02-02      88        76   61
3 2010-02-03      67        84   39
4 2010-02-04      48        95   42

$guys
        date midwest northeast west
1 2010-02-01      16       140   43
2 2010-02-02     115        70   43
3 2010-02-03      63        64   42
4 2010-02-04      54        94   76

1 个答案:

答案 0 :(得分:1)

split / lapply的旧备用

d<-melt(data,id.vars=c("region","date"))
lapply(split(d,d$variable),function(x) dcast(x,date~region,sum))

示例数据有多个匹配,因此我使用了sum的聚合函数。