[英]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
这可以用做dcast
从devel
版本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.