问题描述
来自json文件的R数据作为列表存储在“回合”列中。
> head(leaderboard[,20:22])
round rounds strokes
1 -5 r1,r2,r3,r4,67,68,65 267
2 -7 r1,70,66,63 269
3 -5 r1,72,65 269
4 -7 r1,69,71,63 271
5 -5 r1,65,65 272
6 -1 r1,69 272
> leaderboard$rounds[[1]]
title strokes
1 r1 67
2 r2 68
3 r3 67
4 r4 65
我想获取上面的数据,并使其看起来像:
round r1 r2 r3 r4 strokes
-5 67 68 67 65 267
-7 70 70 66 63 269
> dput(head(leaderboard[,20:22]))
structure(list(round = c("-5","-7","-5","-1"),rounds = list(structure(list(title = c("r1","r2","r3","r4"),strokes = c("67","68","67","65")),class = "data.frame",row.names = c(NA,4L)),structure(list(title = c("r1",strokes = c("70","70","66","63")),strokes = c("72",strokes = c("68","69","71","65","69")),4L))),strokes = c("267","269","271","272","272"
)),6L),class = "data.frame")
解决方法
您可以使用:
library(dplyr)
library(tidyr)
leaderboard %>%
rename(new_strokes = strokes) %>%
unnest(rounds) %>%
pivot_wider(names_from = title,values_from = strokes)
# round new_strokes r1 r2 r3 r4
# <chr> <chr> <chr> <chr> <chr> <chr>
#1 -5 267 67 68 67 65
#2 -7 269 70 70 66 63
#3 -5 269 72 66 66 65
#4 -7 271 68 69 71 63
#5 -5 272 72 70 65 65
#6 -1 272 68 69 66 69
,
这是一种tidyverse
方法
library(dplyr)
library(tidyr)
leaderboard %>% mutate(rounds = lapply(rounds,pivot_wider,names_from = "title",values_from = "strokes")) %>% unnest(rounds)
输出
# A tibble: 6 x 6
round r1 r2 r3 r4 strokes
<chr> <chr> <chr> <chr> <chr> <chr>
1 -5 67 68 67 65 267
2 -7 70 70 66 63 269
3 -5 72 66 66 65 269
4 -7 68 69 71 63 271
5 -5 72 70 65 65 272
6 -1 68 69 66 69 272