将行条目转换为R中的列

Nex*_*eer 0 r reshape dataframe

我将数据放在数据框中,格式如下:

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
Run Code Online (Sandbox Code Playgroud)

我想转换为以下格式:

ID   A    B    C
1    23   43   45
2    43   87   76
3    12   45   24
4    65   76   75
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?

这种转变有名称吗?

A5C*_*2T1 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
Run Code Online (Sandbox Code Playgroud)

您也可以使用dcast"reshape2"软件包(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
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢将命令链接在一起(或者说它还没有在我身上发展),您可以结合"dplyr"包查看"tidyr"包,您可以使用它来执行:

# 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
Run Code Online (Sandbox Code Playgroud)