在 R 列表中,如何设置子列表名称

Posted

技术标签:

【中文标题】在 R 列表中,如何设置子列表名称【英文标题】:In R list ,how to set sub list names 【发布时间】: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。 【参考方案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 = ".")] 有点困惑,如何理解?谢谢! 我已经对其进行了编辑以添加说明。 感谢您的重播。这很棒

以上是关于在 R 列表中,如何设置子列表名称的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中编写一个 for 循环来设置列表中数据集的周期以及开始和结束日期

如何在Java RS json响应中为简单列表类型设置自定义名称

R语言数据结构

如何在保留列表名称和值的同时展平一列列表? [r] [重复]

在 R 中使用 sapply 函数时,如何维护小标题的名称列表?

在 R 中使用 sapply 时如何保留列表的元素名称?