我嵌套了一組看起來像的串列
Example_List = list(Object=list(list(name="A",value=0.1),list(name="B",value=0.5),list(name="C",value=2)))
> Example_List
$Object
$Object[[1]]
$Object[[1]]$name
[1] "A"
$Object[[1]]$value
[1] 0.1
$Object[[2]]
$Object[[2]]$name
[1] "B"
$Object[[2]]$value
[1] 0.5
$Object[[3]]
$Object[[3]]$name
[1] "C"
$Object[[3]]$value
[1] 2
我想檢索與給定名稱對應的串列串列中的值。例如,如果它是name="B",則要檢索的值將是0.5。一種方法是使用多個函式搜索名稱索引lapply,然后使用該索引 ( 2) 檢索值。
R中有更優雅的解決方案嗎?
uj5u.com熱心網友回復:
可能有更簡單的方法可以解決這個問題,但下面的遞回函式可以完成這項作業。
這篇文章也可能有用。
Example_List = list(Object=list(list(name="A",value=0.1),
list(name="B",value=0.5),
list(name="C",value=2)))
find <- function(L, name) {
if(is.list(L)) {
if(any(names(L) == 'name')) {
if(L[['name']] == name) {
return(L[['value']])
} else NULL
} else {
for(ll in L) {
out <- Recall(ll, name)
if(!is.null(out)) return(out)
}
}
} else L
}
find(Example_List, 'A')
#> [1] 0.1
find(Example_List, 'B')
#> [1] 0.5
find(Example_List, 'C')
#> [1] 2
# this one doesn't exist in the list
f <- find(Example_List, 'X')
print(f)
#> NULL
使用reprex v2.0.2創建于 2022-11-08
uj5u.com熱心網友回復:
這個怎么樣?
xy <- sapply(Example_List[[1]], as.data.frame, simplify = FALSE)
xy <- do.call(rbind, xy)
xy
name value
1 A 0.1
2 B 0.5
3 C 2.0
uj5u.com熱心網友回復:
另一種方法是首先將嵌套串列轉換為矩形data.frame,之后按名稱/值進行過濾很容易。例如,
## tidyverse
dplyr::bind_rows(Example_List[[1]])
#> # A tibble: 3 × 2
#> name value
#> <chr> <dbl>
#> 1 A 0.1
#> 2 B 0.5
#> 3 C 2
## data.table
data.table::rbindlist(Example_List[[1]])
#> name value
#> 1: A 0.1
#> 2: B 0.5
#> 3: C 2.0
對于更深的嵌套串列,我們還可以使用rrapply():
rrapply::rrapply(Example_List, how = "bind")
#> name value
#> 1 A 0.1
#> 2 B 0.5
#> 3 C 2.0
按名稱過濾值將很簡單,例如:
library(dplyr)
bind_rows(Example_List[[1]]) |>
filter(name == "A")
#> # A tibble: 1 × 2
#> name value
#> <chr> <dbl>
#> 1 A 0.1
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/529440.html
標籤:r
上一篇:如何將序數變數轉換為二進制變數
下一篇:R澄清公式的含義
