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