如何将 table 转换为命名列表,其中每个列表元素都是 table 中的一行?
How to convert a table to a named list where each list element is a row from the table?
假设我有以下数据集:
fruits <- tibble(
fruit = c("apple", "orange", "pear", "pineapple", "blueberry"),
color = c("red", "orange", "green", "yellow", "blue"),
climate = c("temperate", "(sub)tropical", "temperate", "(sub)tropical", "temperate"),
sugar_per_100g = c(10.39, 9.35, 9.75, 9.85, 9.96)
)
fruit
color
climate
sugar_per_100g
apple
red
temperate
10.39
orange
orange
(sub)tropical
9.35
pear
green
temperate
9.75
pineapple
yellow
(sub)tropical
9.85
blueberry
blue
temperate
9.96
现在我想创建某种查找列表,其中每个列表元素都包含数据集中特定水果的数据。
结果列表应该是这样的:
## $apple
## $apple$color
## [1] "red"
##
## $apple$climate
## [1] "temperate"
##
## $apple$sugar_per_100g
## [1] 10.39
##
##
## $orange
## $orange$color
## [1] "orange"
##
## $orange$climate
## [1] "(sub)tropical"
##
## $orange$sugar_per_100g
## [1] 9.35
##
## ...
我如何在 R 中执行此操作?
这可以归结为 3 个基本步骤:
- 从数据中删除将用于命名的列,因为我们不希望它成为列表的子元素。请记住,命名列的值必须是唯一的。
- 为每一行或 table 创建(子)列表。或者在变体中:转置数据集(输出将是一个列表)。
- 将名称应用于顶级列表元素。名字来源于命名栏。
fruits %>%
select(-fruit) %>% # remove column that will be used for naming
pmap(list) %>% # convert rows to list
set_names(fruits$fruit) # name list with naming column
变体:
fruits %>%
select(-fruit) %>%
transpose(.names = fruits$fruit)
您可以在基数 R:
中作为 one-liner 执行此操作
setNames(lapply(asplit(fruits[-1], 1), as.list), fruits[[1]])
#> $apple
#> $apple$color
#> [1] "red"
#>
#> $apple$climate
#> [1] "temperate"
#>
#> $apple$sugar_per_100g
#> [1] "10.39"
#>
#>
#> $orange
#> $orange$color
#> [1] "orange"
#>
#> $orange$climate
#> [1] "(sub)tropical"
#>
#> $orange$sugar_per_100g
#> [1] " 9.35"
#>
#>
#> $pear
#> $pear$color
#> [1] "green"
#>
#> $pear$climate
#> [1] "temperate"
#>
#> $pear$sugar_per_100g
#> [1] " 9.75"
#>
#>
#> $pineapple
#> $pineapple$color
#> [1] "yellow"
#>
#> $pineapple$climate
#> [1] "(sub)tropical"
#>
#> $pineapple$sugar_per_100g
#> [1] " 9.85"
#>
#>
#> $blueberry
#> $blueberry$color
#> [1] "blue"
#>
#> $blueberry$climate
#> [1] "temperate"
#>
#> $blueberry$sugar_per_100g
#> [1] " 9.96"
由 reprex package (v2.0.1)
于 2022-04-13 创建
你可以试试这个
> setNames(lapply(1:nrow(fruits), function(k) as.list(fruits[k, -1])), fruits[[1]])
$apple
$apple$color
[1] "red"
$apple$climate
[1] "temperate"
$apple$sugar_per_100g
[1] 10.39
$orange
$orange$color
[1] "orange"
$orange$climate
[1] "(sub)tropical"
$orange$sugar_per_100g
[1] 9.35
$pear
$pear$color
[1] "green"
$pear$climate
[1] "temperate"
$pear$sugar_per_100g
[1] 9.75
$pineapple
$pineapple$color
[1] "yellow"
$pineapple$climate
[1] "(sub)tropical"
$pineapple$sugar_per_100g
[1] 9.85
$blueberry
$blueberry$color
[1] "blue"
$blueberry$climate
[1] "temperate"
$blueberry$sugar_per_100g
[1] 9.96
假设我有以下数据集:
fruits <- tibble(
fruit = c("apple", "orange", "pear", "pineapple", "blueberry"),
color = c("red", "orange", "green", "yellow", "blue"),
climate = c("temperate", "(sub)tropical", "temperate", "(sub)tropical", "temperate"),
sugar_per_100g = c(10.39, 9.35, 9.75, 9.85, 9.96)
)
fruit | color | climate | sugar_per_100g |
---|---|---|---|
apple | red | temperate | 10.39 |
orange | orange | (sub)tropical | 9.35 |
pear | green | temperate | 9.75 |
pineapple | yellow | (sub)tropical | 9.85 |
blueberry | blue | temperate | 9.96 |
现在我想创建某种查找列表,其中每个列表元素都包含数据集中特定水果的数据。
结果列表应该是这样的:
## $apple
## $apple$color
## [1] "red"
##
## $apple$climate
## [1] "temperate"
##
## $apple$sugar_per_100g
## [1] 10.39
##
##
## $orange
## $orange$color
## [1] "orange"
##
## $orange$climate
## [1] "(sub)tropical"
##
## $orange$sugar_per_100g
## [1] 9.35
##
## ...
我如何在 R 中执行此操作?
这可以归结为 3 个基本步骤:
- 从数据中删除将用于命名的列,因为我们不希望它成为列表的子元素。请记住,命名列的值必须是唯一的。
- 为每一行或 table 创建(子)列表。或者在变体中:转置数据集(输出将是一个列表)。
- 将名称应用于顶级列表元素。名字来源于命名栏。
fruits %>%
select(-fruit) %>% # remove column that will be used for naming
pmap(list) %>% # convert rows to list
set_names(fruits$fruit) # name list with naming column
变体:
fruits %>%
select(-fruit) %>%
transpose(.names = fruits$fruit)
您可以在基数 R:
中作为 one-liner 执行此操作setNames(lapply(asplit(fruits[-1], 1), as.list), fruits[[1]])
#> $apple
#> $apple$color
#> [1] "red"
#>
#> $apple$climate
#> [1] "temperate"
#>
#> $apple$sugar_per_100g
#> [1] "10.39"
#>
#>
#> $orange
#> $orange$color
#> [1] "orange"
#>
#> $orange$climate
#> [1] "(sub)tropical"
#>
#> $orange$sugar_per_100g
#> [1] " 9.35"
#>
#>
#> $pear
#> $pear$color
#> [1] "green"
#>
#> $pear$climate
#> [1] "temperate"
#>
#> $pear$sugar_per_100g
#> [1] " 9.75"
#>
#>
#> $pineapple
#> $pineapple$color
#> [1] "yellow"
#>
#> $pineapple$climate
#> [1] "(sub)tropical"
#>
#> $pineapple$sugar_per_100g
#> [1] " 9.85"
#>
#>
#> $blueberry
#> $blueberry$color
#> [1] "blue"
#>
#> $blueberry$climate
#> [1] "temperate"
#>
#> $blueberry$sugar_per_100g
#> [1] " 9.96"
由 reprex package (v2.0.1)
于 2022-04-13 创建你可以试试这个
> setNames(lapply(1:nrow(fruits), function(k) as.list(fruits[k, -1])), fruits[[1]])
$apple
$apple$color
[1] "red"
$apple$climate
[1] "temperate"
$apple$sugar_per_100g
[1] 10.39
$orange
$orange$color
[1] "orange"
$orange$climate
[1] "(sub)tropical"
$orange$sugar_per_100g
[1] 9.35
$pear
$pear$color
[1] "green"
$pear$climate
[1] "temperate"
$pear$sugar_per_100g
[1] 9.75
$pineapple
$pineapple$color
[1] "yellow"
$pineapple$climate
[1] "(sub)tropical"
$pineapple$sugar_per_100g
[1] 9.85
$blueberry
$blueberry$color
[1] "blue"
$blueberry$climate
[1] "temperate"
$blueberry$sugar_per_100g
[1] 9.96