【问题标题】:Convert a data.frame/tibble to a list in a grouped manner以分组的方式将 data.frame/tibble 转换为列表
【发布时间】:2017-08-15 15:17:15
【问题描述】:

我想将列表中的数据框转换为特定格式(前面的最小示例)。 对于以下数据框,我希望得到一个包含 5 个元素的列表,每个元素本身都有一个包含 5 个元素的列表。

parameters = tidyr::expand(tibble(id=1:5, value = 1:5 * 2),id,value)

# A tibble: 6 x 2
     id value
  <int> <dbl>
1     1     2
2     1     4
3     1     6
4     1     8
5     1    10
6     2     2

result = base::split(parameters, list(parameters$id))
result = lapply(result, function(x) { x["id"] <- NULL; x })

到目前为止,它获得了正确的 id(5 个元素),但没有获得其中的子元素。它给出了第一个元素

> a[1]
$`1`
# A tibble: 5 x 1
  value
  <dbl>
1     2
2     4
3     6
4     8
5    10

而我想拥有它

> as.list(a$`1`$value)
[[1]]
[1] 2

[[2]]
[1] 4

[[3]]
[1] 6

[[4]]
[1] 8

[[5]]
[1] 10

结果看起来像这样

[1]
  [[1]]
  [1] 2

   [[2]]
   [1] 4

   [[3]]
   [1] 6

   [[4]]
   [1] 8

   [[5]]
   [1] 10
[2]
  [[1]]
  [1] 2

   [[2]]
   [1] 4

   [[3]]
   [1] 6

   [[4]]
   [1] 8

   [[5]]
   [1] 10

有什么优雅的方法可以实现这一点吗?

【问题讨论】:

  • 请注意 result = base::split(parameters$value, list(parameters$id)) 使第二行 lapply 不必要。
  • 感谢您的提示!

标签: r list


【解决方案1】:

as.list 包裹在lapply 中应该做你想做的事:

lapply(with(parameters, split(value, id)), as.list)

$`1`
$`1`[[1]]
[1] 2

$`1`[[2]]
[1] 4

$`1`[[3]]
[1] 6

$`1`[[4]]
[1] 8

$`1`[[5]]
[1] 10


$`2`
$`2`[[1]]
[1] 2

$`2`[[2]]
[1] 4

$`2`[[3]]
[1] 6

$`2`[[4]]
[1] 8

$`2`[[5]]
[1] 10

【讨论】:

    猜你喜欢
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多