我将数据放在数据框中,格式如下:
ID GRP VAL
1 A 23
2 A 43
3 A 12
4 A 65
1 B 43
2 B 87
3 B 45
4 B 76
1 C 45
2 C 76
3 C 24
4 C 75
我想转换为以下格式:
ID A B C
1 23 43 45
2 43 87 76
3 12 45 24
4 65 76 75
我怎样才能完成这项工作?
这种转变有名称吗?
答案 0 :(得分:5)
这是一个很常见的长期"到"宽"转型被称为"重塑"你的数据。
以下是一些选项:
在基地R:
> reshape(mydf, direction = "wide", idvar="ID", timevar="GRP")
ID VAL.A VAL.B VAL.C
1 1 23 43 45
2 2 43 87 76
3 3 12 45 24
4 4 65 76 75
> xtabs(VAL ~ ID + GRP, mydf)
GRP
ID A B C
1 23 43 45
2 43 87 76
3 12 45 24
4 65 76 75
您还可以使用" reshape2"中的dcast
。包(还有dcast.data.table
这是dcast
的重写,但会提高你的速度。
> library(reshape2)
> dcast(mydf, ID ~ GRP, value.var="VAL")
ID A B C
1 1 23 43 45
2 2 43 87 76
3 3 12 45 24
4 4 65 76 75
如果您喜欢将命令链接在一起(或者说它还没有成长),您可以查看" tidyr"包装与" dplyr"包,你可以做:
# devtools::install_github("hadley/tidyr")
library(dplyr)
library(tidyr)
mydf %>%
group_by(ID) %>%
spread(GRP, VAL)
# Source: local data frame [4 x 4]
#
# ID A B C
# 1 1 23 43 45
# 2 2 43 87 76
# 3 3 12 45 24
# 4 4 65 76 75