gpt4 book ai didi

r - 使用 tidyverse 将嵌套列表添加到数据框

转载 作者:行者123 更新时间:2023-12-05 09:28:15 25 4
gpt4 key购买 nike

我有一个嵌套列表,它来自于读取存储视频游戏日志信息的 JSON。列表的 time 元素是一个简单的向量,而 inputManagerStatessyncedProperties 是可能包含 0 个或多个元素的列表。

我正在尝试将数据转换为表格(长格式)。

更新:列表

test_list <- 
list(list(time = 9.92405605316162, inputManagerStates = list(),
syncedProperties = list()), list(time = 9.9399995803833,
inputManagerStates = list(list(inputId = "InputY", buttonState = FALSE,
axisValue = 0), list(inputId = "InputX", buttonState = FALSE,
axisValue = 0.0501395985484123), list(inputId = "xPos",
buttonState = FALSE, axisValue = 5), list(inputId = "yPos",
buttonState = FALSE, axisValue = 0.0799999982118607),
list(inputId = "zPos", buttonState = FALSE, axisValue = 0),
list(inputId = "xRot", buttonState = FALSE, axisValue = 0),
list(inputId = "yRot", buttonState = FALSE, axisValue = -0.70664256811142),
list(inputId = "zRot", buttonState = FALSE, axisValue = 0),
list(inputId = "wRot", buttonState = FALSE, axisValue = 0.707570731639862)),
syncedProperties = list(list(name = "timeStamp", value = "97,2"))),
list(time = 9.95659446716309, inputManagerStates = list(list(
inputId = "InputY", buttonState = FALSE, axisValue = 0),
list(inputId = "InputX", buttonState = FALSE, axisValue = 0.0993990004062653),
list(inputId = "xPos", buttonState = FALSE, axisValue = 5),
list(inputId = "yPos", buttonState = FALSE, axisValue = 0.0799999982118607),
list(inputId = "zPos", buttonState = FALSE, axisValue = 0),
list(inputId = "xRot", buttonState = FALSE, axisValue = 0),
list(inputId = "yRot", buttonState = FALSE, axisValue = -0.705721318721771),
list(inputId = "zRot", buttonState = FALSE, axisValue = 0),
list(inputId = "wRot", buttonState = FALSE, axisValue = 0.708489596843719)),
syncedProperties = list(list(name = "timeStamp", value = "97,21667"))),
list(time = 20.0626411437988, inputManagerStates = list(list(
inputId = "InputY", buttonState = FALSE, axisValue = 0.601816594600677),
list(inputId = "InputX", buttonState = FALSE, axisValue = 0),
list(inputId = "xPos", buttonState = FALSE, axisValue = -1.31777036190033),
list(inputId = "yPos", buttonState = FALSE, axisValue = 0.0800001174211502),
list(inputId = "zPos", buttonState = FALSE, axisValue = 6.08214092254639),
list(inputId = "xRot", buttonState = FALSE, axisValue = 0),
list(inputId = "yRot", buttonState = FALSE, axisValue = -0.391442984342575),
list(inputId = "zRot", buttonState = FALSE, axisValue = 0),
list(inputId = "wRot", buttonState = FALSE, axisValue = 0.920202374458313)),
syncedProperties = list(list(name = "timeStamp", value = "107,3167"),
list(name = "previousGameState", value = "1"), list(
name = "newGameState", value = "2"))))

我尝试过的

  library(tidyverse)

test_list %>%
tibble::enframe(name = "epoch", value = "value") %>%
tidyr::unnest_wider(value) %>%
tidyr::unnest(inputManagerStates, keep_empty = TRUE) %>%
tidyr::unnest(syncedProperties, keep_empty = TRUE) %>%
tidyr::unnest_wider(syncedProperties)

# A tibble: 19 x 5
epoch time inputManagerStates name value
<int> <dbl> <list> <chr> <chr>
1 1 9.92 <NULL> NA NA
2 2 9.94 <named list [3]> timeStamp 97,2
3 2 9.94 <named list [3]> timeStamp 97,2
4 2 9.94 <named list [3]> timeStamp 97,2
5 2 9.94 <named list [3]> timeStamp 97,2
6 2 9.94 <named list [3]> timeStamp 97,2
7 2 9.94 <named list [3]> timeStamp 97,2
8 2 9.94 <named list [3]> timeStamp 97,2
9 2 9.94 <named list [3]> timeStamp 97,2
10 2 9.94 <named list [3]> timeStamp 97,2
11 3 9.96 <named list [3]> timeStamp 97,21667
12 3 9.96 <named list [3]> timeStamp 97,21667
13 3 9.96 <named list [3]> timeStamp 97,21667
14 3 9.96 <named list [3]> timeStamp 97,21667
15 3 9.96 <named list [3]> timeStamp 97,21667
16 3 9.96 <named list [3]> timeStamp 97,21667
17 3 9.96 <named list [3]> timeStamp 97,21667
18 3 9.96 <named list [3]> timeStamp 97,21667
19 3 9.96 <named list [3]> timeStamp 97,21667

我设法将 syncedProperties 放入列中(我将删除列 name 并将 value 重命名为 timeStamp)。我在使用 inputManagerStates 列表时遇到问题。

提前谢谢你。

最佳答案

也许这有帮助

library(dplyr)
library(purrr)
library(tidyr)
library(jsonlite)
toJSON(test_list) %>%
fromJSON(flatten = TRUE) %>%
unnest(everything(), keep_empty = TRUE) %>%
mutate(across(where(is.list),
~ map(.x, ~ if(is.null(.x)) NA else .x))) %>%
unnest(where(is.list))

-输出

# A tibble: 19 × 6
time inputId buttonState axisValue name value
<dbl> <chr> <lgl> <dbl> <chr> <chr>
1 9.92 <NA> NA NA <NA> <NA>
2 9.94 InputY FALSE 0 timeStamp 97,2
3 9.94 InputX FALSE 0.0501 timeStamp 97,2
4 9.94 xPos FALSE 5 timeStamp 97,2
5 9.94 yPos FALSE 0.08 timeStamp 97,2
6 9.94 zPos FALSE 0 timeStamp 97,2
7 9.94 xRot FALSE 0 timeStamp 97,2
8 9.94 yRot FALSE -0.707 timeStamp 97,2
9 9.94 zRot FALSE 0 timeStamp 97,2
10 9.94 wRot FALSE 0.708 timeStamp 97,2
11 9.96 InputY FALSE 0 timeStamp 97,21667
12 9.96 InputX FALSE 0.0994 timeStamp 97,21667
13 9.96 xPos FALSE 5 timeStamp 97,21667
14 9.96 yPos FALSE 0.08 timeStamp 97,21667
15 9.96 zPos FALSE 0 timeStamp 97,21667
16 9.96 xRot FALSE 0 timeStamp 97,21667
17 9.96 yRot FALSE -0.706 timeStamp 97,21667
18 9.96 zRot FALSE 0 timeStamp 97,21667
19 9.96 wRot FALSE 0.708 timeStamp 97,21667

有了新的数据集,unnest 可以单独完成

toJSON(test_list) %>%
fromJSON(flatten = TRUE) %>%
unnest(inputManagerStates, keep_empty = TRUE) %>%
unnest(syncedProperties, keep_empty = TRUE) %>%
unnest(everything())
# A tibble: 46 × 6
time inputId buttonState axisValue name value
<dbl> <chr> <lgl> <dbl> <chr> <chr>
1 9.92 NA NA NA NA NA
2 9.94 InputY FALSE 0 timeStamp 97,2
3 9.94 InputX FALSE 0.0501 timeStamp 97,2
4 9.94 xPos FALSE 5 timeStamp 97,2
5 9.94 yPos FALSE 0.08 timeStamp 97,2
6 9.94 zPos FALSE 0 timeStamp 97,2
7 9.94 xRot FALSE 0 timeStamp 97,2
8 9.94 yRot FALSE -0.707 timeStamp 97,2
9 9.94 zRot FALSE 0 timeStamp 97,2
10 9.94 wRot FALSE 0.708 timeStamp 97,2
# … with 36 more rows

关于r - 使用 tidyverse 将嵌套列表添加到数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71563435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com