0

我正在尝试采用长格式数据框并根据不同变量的列表从中创建几个宽格式数据框。

我的想法是使用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 来更简洁地执行此操作,而不是为每个 {“employed”、“girls”、“guys”} 分别运行 melt 和 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
4

1 回答 1

1

split/lapply 的老备用

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

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

于 2015-08-10T19:15:33.317 回答