Ответ 1
В "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