如何在R语言列表的子元素上使用setNames函数
问题与解决方案
需求说明
从数据框生成列表后,需要为每个子元素设置包含父元素名称的命名,且列表元素数量和子元素结构可变,无法手动逐个处理。
初始代码与当前结构
生成数据和列表的代码:
mydf <- data.frame(Patient=rep(paste0('Pat', 1:3), 2), Cycle=rep(paste0('C', 1:2), each=3)) mylist <- sapply(mydf, unique)
当前列表输出:
> mylist $Patient [1] "Pat1" "Pat2" "Pat3" $Cycle [1] "C1" "C2"
期望结果
子元素名称需由「父元素名称-子元素值」组成:
> mylist $Patient Patient-Pat1 Patient-Pat2 Patient-Pat3 "Pat1" "Pat2" "Pat3" $Cycle Cycle-C1 Cycle-C2 "C1" "C2"
可行实现方案
方案1:使用Map函数(基础R推荐)
Map可同时迭代列表元素和对应名称,精准匹配需求:
mylist <- Map(function(elem, parent_name) { setNames(elem, paste(parent_name, elem, sep = "-")) }, mylist, names(mylist))
方案2:使用lapply遍历列表名称
通过遍历列表名称,逐个处理子元素并设置命名:
mylist <- lapply(names(mylist), function(parent_name) { elem <- mylist[[parent_name]] setNames(elem, paste(parent_name, elem, sep = "-")) })
原尝试失败原因
你之前的sapply写法存在逻辑问题:
sapply(mylist, setNames, paste(names(mylist), mylist, sep='-'))
这里paste(names(mylist), mylist, sep='-')会把整个子元素向量和父名称拼接成单个字符串(比如"Patient-c(\"Pat1\", \"Pat2\", \"Pat3\")"),得到长度为2的向量,而setNames需要与子元素长度匹配的名称向量,因此无法正确设置命名。
内容的提问来源于stack exchange,提问作者DaniCee
相关产品推荐
相关产品推荐

