【问题标题】:In R list ,how to set sub list names在 R 列表中,如何设置子列表名称
【发布时间】:2022-01-13 08:54:22
【问题描述】:

如何设置列表名称,代码如下。 目前split_data包含两个子列表[[1]][[2]],如何分别给它们命名? 我想为[[1]] 设置名称'A',为[[2]] 设置名称'B',所以可以使用split_data['A'] 检索数据... 任何人都可以帮助解决这个问题,谢谢? 例如ma <- list(a=c('a1','a2'),b=c('b1','b2')) 可以使用ma["a"] 作为子列表

library(tidyverse)
test_data <- data.frame(category=c('A','B','A','B','A','B','A','B'),
                        sales=c(1,2,4,5,8,1,4,6))

split_data <- test_data %>% group_split(category)

【问题讨论】:

  • 根据group_split() tidyverse 开发人员的文档故意不希望列表元素被命名(它们有时会很烦人......)所以你可以使用基本函数split(),在您的案例test_data %&gt;% split(test_data[['category']]) 返回一个命名列表。
  • @qdread - 或者使用更简洁的公式界面test_data %&gt;% split(~ category)
  • @Ritchie Sacramento test_data %>% split(~ category) 似乎无法正常工作,它显示“unique.default(x, nmax = nmax) 中的错误:unique() 仅适用于向量”
  • @anderwyang - 抱歉,应该提到这是一个相对较新的功能(自 R 4.1.0 起),所以如果您看到该错误,那么您需要更新 R。

标签: r list names


【解决方案1】:

其他人在 cmets 中向您展示了如何使用 split() 而不是 group_split() 获得您想要的东西。这似乎是最简单的解决方案。

但是,如果您坚持使用现有代码,这里有一个替代方案,可以保留您当前的代码并添加名称。

library(tidyverse)
test_data <- data.frame(category=c('A','B','A','B','A','B','A','B'),
                        sales=c(1,2,4,5,8,1,4,6))

split_data <- test_data %>% group_split(category)


names(split_data) <- test_data %>% group_by(category) %>% group_keys() %>% apply(1, paste, collapse = ".")

想法是使用group_by 以与group_split 相同的方式进行拆分,然后将键提取为小标题。这将每组有一行,但在不同的列中会有不同的变量,所以我通过粘贴带有点作为分隔符的列来将它们放在一起。管道中的最后一个表达式等价于apply(keys, 1, f) 其中ffunction(row) paste(row, collapse = ".")。它将f 应用于tibble 的每一行,生成一个名称。

即使拆分发生在多个变量上,这也应该可以工作,并产生类似于split() 产生的名称。

【讨论】:

  • 这很棒。但我对 [apply(1, paste, collapse = ".")] 有点困惑,如何理解?谢谢!
  • 我已经对其进行了编辑以添加说明。
  • 感谢您的重播。这很棒
猜你喜欢
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多