Свернуть переменные в длинном формате кадра данных R
У меня есть датафрейм в длинном формате, как
id varA varB
1 'a' 112
1 'b' 212
1 'c' 308
2 'a' 99
2 'b' 123
2 'c' 452
Я хочу рухнуть за id
значения в varB
за varA == 'a'
а также varA == 'b'
,
В широком кадре данных, как:
id varBa varBb varBc
1 112 212 308
2 99 123 452
... я бы просто использовал apply или векторизованное дополнение, например df$collapsed = df$varBa + df$varBb
,
Как я могу сделать это с длинным форматом данных? (Наличие только широкого формата не вариант из-за факторного анализа последующих мероприятий).
Можно ли свернуть (или выполнить любую другую арифметическую операцию) в длинном формате, чтобы у меня была дополнительная строка для свернутых значений?
2 ответа
Попробуй это:
dfw <- reshape(df,
timevar = "varA",
idvar = c("id"),
direction = "wide")
dfw
id varB.a varB.b varB.c
1 1 112 212 308
4 2 99 123 452
Затем вы можете выполнять любые математические операции с новым фреймом данных.
Использование Tidyr:
df <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L),
varA = c("a","b", "c", "a", "b", "c"),
varB = c(112L, 212L, 308L, 99L, 123L, 452L)),
.Names = c("id", "varA", "varB"),
class = "data.frame",
row.names = c(NA,-6L))
library(tidyr)
wide_df <- spread(df, varA, varB )
id a b c
1 1 112 212 308
2 2 99 123 452
Если вы хотите изменить заголовки на varBa и т. Д., Вы можете использовать dplyr mutate
Функция немного изменить вар.
wide_df <- dplyr::mutate(df, varA = paste("varB",df$varA, sep="")) %>%
spread(varA, varB )
id varBa varBb varBc
1 1 112 212 308
2 2 99 123 452