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
我已经玩 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