我有一些非常嵌套的資料。在我的 list-column-dataframes 中,我需要將一些部分放在一起,我已經在一個實體中完成了這些操作以獲得我想要的資料幀:
a <- df[[2]][["result"]]@data
b <- df[[2]][["result"]]@coords
desired_df <- cbind(a, b)
我原來的大串列有 171 個元素,這意味著我有 1:171 (3.3 GB) 可以放入這些方括號內,理想情況下最終會得到 171 個所需的資料幀(然后我將它們系結在一起)。
我已經 10 年不需要寫回圈了,但我沒有看到處理這個問題的 tidyverse 方法。我也不再知道如何撰寫回圈。肯定有一些元素是垃圾并且會失敗。
uj5u.com熱心網友回復:
如果我了解您的資料結構(我可能不了解),您可以這樣做:
library(tidyverse)
# Create dummy data
df <- mtcars
df$mpg <- list(result = I(list('test')))
df$mpg$result <- list("@data" = I(list('your data')))
df <- df %>% select(mpg, cyl)
df1 <- df
df2 <- df
# Pull data you're interested in.
# The index is 1 here, instead of 2, because it's fake data and not your data.
# Assuming the @ is not unique, and is just parsed from JSON or some other format.
dont_at_me <- function(x){
a <- x[[1]][["result"]][["@data"]]
a
}
# Get a list of all of your data.frames
all_dfs <- Filter(function(x) is(x, "data.frame"), mget(ls()))
# Vectorize
purrr::map(all_dfs, ~dont_at_me(.))
uj5u.com熱心網友回復:
您沒有提供任何型別的最小資料示例。
我把它濃縮成這樣的意思
methods::setClass(
"weird_object",
slots = c(data = "data.frame", coords = "matrix")
)
df <- list(
list(
result = new("weird_object")
),list(
result = new("weird_object")
),list(
result = new("weird_object")
),list(
result = new("weird_object")
)
)
如果我有這些物件的串列,那么我可以做
df %>%
map(. %>% {
list(data = .$result@data,
cooords = .$result@coords)
}) %>%
enframe() %>%
unnest_wider(value)
但是選擇/提升功能可能會失敗,因此可以將其包裝在 a 中purrr::possibly,并選擇一個合理的默認值:
df %>%
map(possibly(. %>% {
list(data = .$result@data,
cooords = .$result@coords)
},
otherwise = list(data = NA, coords = NA))) %>%
enframe() %>%
unnest_wider(value)
希望這可以向前邁出一步。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/328195.html
上一篇:識別兩個序列之間的突變
