如何将 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 个基本步骤:

  1. 从数据中删除将用于命名的列,因为我们不希望它成为列表的子元素。请记住,命名列的值必须是唯一的。
  2. 为每一行或 table 创建(子)列表。或者在变体中:转置数据集(输出将是一个列表)。
  3. 将名称应用于顶级列表元素。名字来源于命名栏。
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