【问题标题】:Passing variable names to mapply (using reshape)将变量名称传递给 mapply(使用 reshape)
【发布时间】: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)

标签: r mapply


【解决方案1】:

split/lapply的老备用

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

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

【讨论】:

  • 啊,更直接了,考虑到在融合数据时所有这些变量都放在“变量”列下
猜你喜欢
  • 2017-07-21
  • 1970-01-01
  • 2014-08-13
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 2019-07-30
  • 1970-01-01
相关资源
最近更新 更多