R reshape - 似乎无法根据需要投射数据框

R reshape - Can't seem to cast data frame as I need it

我已经玩 reshape 几个小时了,我似乎无法将我的数据框转换为我需要的形式。简而言之,我有几个 id 变量但是也是两个值变量。取下面的长格式df。

playerid    leagueid    franchise   week    score   variable    value
10048       10087       11          1       7       tran_type   nonstart
10074       10087       2           1       11      tran_type   start
10077       10087       7           1       17      tran_type   start
10260       10087       6           2       8       tran_type   nonstart
10267       10087       7           2       7       tran_type   start
10269       10087       12          2       23      tran_type   start

我想将此数据框重塑为以下内容,以便新的宽列由 week 值命名,后跟单元格中包含的数据类型(例如,'value' 用于 .value 列,'score' 用于 .score 列)。

playerid    leagueid    franchise   1.value     1.score     2.value     2.score
10048       10087       11          nonstart    7       
10074       10087       2           start       11  
10077       10087       7           start       17  
10260       10087       6                                   nonstart    8
10267       10087       7                                   start       7   
10269       10087       12                                  start       23

也许我误解了 reshape 的功能,但非常感谢有关如何根据需要转换我的数据的指导 - 我已经花了很多时间在这上面已经尝试了变量的不同排列 cast函数。谢谢!

使用tidyr

library(tidyr)
library(dplyr)
dta %>% mutate(week2 = paste0(week, ".value"),
               week = paste0(week, ".score")) %>%
        spread(week, score) %>%
        spread(week2, value)

  playerid leagueid franchise  variable 1.score 2.score  1.value  2.value
1    10048    10087        11 tran_type       7      NA nonstart     <NA>
2    10074    10087         2 tran_type      11      NA    start     <NA>
3    10077    10087         7 tran_type      17      NA    start     <NA>
4    10260    10087         6 tran_type      NA       8     <NA> nonstart
5    10267    10087         7 tran_type      NA       7     <NA>    start
6    10269    10087        12 tran_type      NA      23     <NA>    start

您也可以使用 unite:

z <- dta %>% unite(temp, score, value) %>%
             spread(week, temp)

  playerid leagueid franchise  variable          1          2
1    10048    10087        11 tran_type 7_nonstart       <NA>
2    10074    10087         2 tran_type   11_start       <NA>
3    10077    10087         7 tran_type   17_start       <NA>
4    10260    10087         6 tran_type       <NA> 8_nonstart
5    10267    10087         7 tran_type       <NA>    7_start
6    10269    10087        12 tran_type       <NA>   23_start

如果您想要单独列中的值,请使用 separate:

z %>% separate("1", c("1.score", "1.value"), extra="drop") %>%
      separate("2", c("2.score", "2.value"), extra="drop")

  playerid leagueid franchise  variable 1.score  1.value 2.score  2.value
1    10048    10087        11 tran_type       7 nonstart    <NA>     <NA>
2    10074    10087         2 tran_type      11    start    <NA>     <NA>
3    10077    10087         7 tran_type      17    start    <NA>     <NA>
4    10260    10087         6 tran_type    <NA>     <NA>       8 nonstart
5    10267    10087         7 tran_type    <NA>     <NA>       7    start
6    10269    10087        12 tran_type    <NA>     <NA>      23    start

这可以通过 devel 版本 data.table 中的 dcast 来完成,我们可以在 value.var 中传递多个值列。我们将 'data.frame' 转换为 'data.table' (setDT(df1)) 并使用 dcast.

library(data.table)#v1.9.5+
dcast(setDT(df1), playerid+leagueid+franchise ~ week,
                     value.var=c('score', 'value'), sep='.')
#     playerid leagueid franchise score.1 score.2  value.1  value.2
#1:    10048    10087        11       7      NA nonstart       NA
#2:    10074    10087         2      11      NA    start       NA
#3:    10077    10087         7      17      NA    start       NA
#4:    10260    10087         6      NA       8       NA nonstart
#5:    10267    10087         7      NA       7       NA    start
#6:    10269    10087        12      NA      23       NA    start

注意:安装 data.table 开发版的说明是 here