【发布时间】:2015-08-10 18:58:12
【问题描述】:
我正在尝试获取一个长格式数据帧,并根据不同变量的列表从中创建几个宽格式数据帧。
我的想法是使用 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
【问题讨论】:
-
你能显示预期的输出吗?也许
library(data.table); setDT(data)[, indx:=1:.N, date]; dcast(data, indx+date~region, value.var=c('employed', 'girls', 'guys')) -
看起来预期的输出和输入数据集不匹配。使用
mapplymapply(function(x,y) dcast(cbind(x,y), date~region, value.var='x', sum), list(data[1:2]), x=data[3:5], SIMPLIFY=FALSE)