我有一个长格式的数据帧,如
id varA varB
1 'a' 112
1 'b' 212
1 'c' 308
2 'a' 99
2 'b' 123
2 'c' 452
我想将varA == 'a'
和varA == 'b'
在varB
中的值按id
折叠。
在宽数据框中,如:
id varBa varBb varBc
1 112 212 308
2 99 123 452
…我会简单地使用apply或像df$collapsed = df$varBa + df$varBb
这样的矢量化加法。
我如何使用长格式数据框架做到这一点?(由于后续因素分析,只有宽格式不是一个选择)。
是否可以在长格式中折叠(或执行任何其他算术运算),以便我有额外的行来放置折叠的值?
试试这个:
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
然后你可以在新的数据帧上做任何数学运算。
Using 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
函数将varA更改为位
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