我试图采用长格式数据帧,并根据不同变量列表从中创建多个宽格式数据帧。
我的想法是使用 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
答案 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的聚合函数。