繁体   English   中英

R重塑-似乎无法根据需要投射数据帧

[英]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列的“值”和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 ,但将不胜感激指导,如何把我的数据,我desired-已经花了这么多时间在这已经尝试在变量不同的排列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

这可以用做dcastdevel版本data.table在这里我们可以在传递多个值列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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM