在 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 %>% split(test_data[['category']])
返回一个命名列表。
@qdread - 或者使用更简洁的公式界面test_data %>% 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)
其中f
是function(row) paste(row, collapse = ".")
。它将f
应用于tibble 的每一行,生成一个名称。
即使拆分发生在多个变量上,这也应该可以工作,并产生类似于split()
产生的名称。
【讨论】:
这很棒。但我对 [apply(1, paste, collapse = ".")] 有点困惑,如何理解?谢谢! 我已经对其进行了编辑以添加说明。 感谢您的重播。这很棒以上是关于在 R 列表中,如何设置子列表名称的主要内容,如果未能解决你的问题,请参考以下文章
如何在 R 中编写一个 for 循环来设置列表中数据集的周期以及开始和结束日期
如何在Java RS json响应中为简单列表类型设置自定义名称
如何在保留列表名称和值的同时展平一列列表? [r] [重复]