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

Passing variable names to mapply (using reshape)

我正在尝试获取一个长格式数据帧,并根据不同变量列表从中创建多个宽格式数据帧。

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

数据:

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 比 运行 为每个 {"employed"、"girls"、"guys"} 分别熔化和 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

split/lapply

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

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