一次重塑多个值

我有一个很长的数据集,我想扩大范围,我很好奇是否有一种方法可以使用R中的reshape2或tidyr包一步完成所有这些工作。


数据框df如下所示:


id  type    transactions    amount

20  income       20          100

20  expense      25          95

30  income       50          300

30  expense      45          250

我想得到这个:


id  income_transactions expense_transactions    income_amount   expense_amount

20       20                           25                 100             95

30       50                           45                 300             250

我知道我可以通过例如reshape2来实现这一目标:


dcast(df, id ~  type, value.var="transactions")

但是,是否有一种方法可以一次处理“交易”和“金额”变量,从而一次重塑整个df?理想情况下,使用新的更合适的列名?


交互式爱情
浏览 549回答 2
2回答

开心每一天1111

在“ reshape2”中,您可以使用recast(尽管根据我的经验,这不是众所周知的功能)。library(reshape2)recast(mydf, id ~ variable + type, id.var = c("id", "type"))#   id transactions_expense transactions_income amount_expense amount_income# 1 20                   25                  20             95           100# 2 30                   45                  50            250           300您还可以使用基数R reshape:reshape(mydf, direction = "wide", idvar = "id", timevar = "type")#   id transactions.income amount.income transactions.expense amount.expense# 1 20                  20           100                   25             95# 3 30                  50           300                   45            250或者,你可以melt和dcast,像这样的(这里“data.table”):library(data.table)library(reshape2)dcast.data.table(melt(as.data.table(mydf), id.vars = c("id", "type")),                  id ~ variable + type, value.var = "value")#    id transactions_expense transactions_income amount_expense amount_income# 1: 20                   25                  20             95           100# 2: 30                   45                  50            250           300在dcast.data.table“ data.table”(1.9.8)的更高版本中,您将可以直接执行此操作。如果我正确理解的话,@ Arun尝试实现的内容将是在无需首先melt获取数据的情况下进行重塑,这就是当前发生的情况recast,本质上是melt+ dcast操作序列的包装。而且,为彻底起见,这里是tidyr方法:library(dplyr)library(tidyr)mydf %>%   gather(var, val, transactions:amount) %>%   unite(var2, type, var) %>%   spread(var2, val)#   id expense_amount expense_transactions income_amount income_transactions# 1 20             95                   25           100                  20# 2 30            250                   45           300                  50

慕标琳琳

使用data.table v1.9.6 +,我们可以value.var同时转换多个列(并在中使用多个聚合函数fun.aggregate)。请查看?dcast更多信息以及示例部分。require(data.table) # v1.9.6+dcast(dt, id ~ type, value.var=names(dt)[3:4])#    id transactions_expense transactions_income amount_expense amount_income# 1: 20                   25                  20             95           100# 2: 30                   45                  50            250           300
打开App,查看更多内容
随时随地看视频慕课网APP