columns r dataframe reshape reshape2 tidyr

rows to columns in r



Reformar mĂșltiples valores a la vez (2)

Con data.table v1.9.6 +, podemos convertir múltiples columnas value.var simultáneamente (y también usar múltiples funciones de agregación en fun.aggregate ). Consulte ?dcast para obtener más información y también la sección de ejemplos.

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

Tengo un conjunto de datos largo que me gustaría ampliar y tengo curiosidad por saber si hay una manera de hacerlo todo en un solo paso utilizando los paquetes reshape2 o tidyr en R.

El marco de datos df ve así:

id type transactions amount 20 income 20 100 20 expense 25 95 30 income 50 300 30 expense 45 250

Me gustaría llegar a esto:

id income_transactions expense_transactions income_amount expense_amount 20 20 25 100 95 30 50 45 300 250

Sé que puedo obtener parte del camino con reshape2 a través de, por ejemplo:

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

Pero, ¿hay alguna forma de remodelar todo el df de una sola vez para abordar las variables "transacciones" y "cantidad" a la vez? ¿E idealmente con nuevos nombres de columna más apropiados?


En "reshape2", puede usar la recast (aunque en mi experiencia, esta no es una función ampliamente conocida).

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

También puede usar la reshape la base R:

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

O bien, puede melt y dcast , de esta manera (aquí con "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

En versiones posteriores de dcast.data.table de "data.table" (1.9.8) podrá hacerlo directamente . Si entiendo correctamente, lo que @Arun está tratando de implementar sería hacer la remodelación sin tener que melt los datos, que es lo que sucede actualmente con la recast , que es esencialmente un contenedor para una secuencia de operaciones de melt + dcast .

Y, para mayor tidyr , aquí está el enfoque 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