如何在列表的子元素上使用setNames

问题描述 投票:0回答:1

我发现了这个问题,但它似乎对我不起作用。

任务很简单。我有一个从数据框中获得的如下列表,我想

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"

我唯一想做的就是为子元素添加

setNames
,以便它们包含元素名称,从而形成最终列表:

> mylist
$Patient
Patient-Pat1 Patient-Pat2 Patient-Pat3 
      "Pat1"       "Pat2"       "Pat3" 

$Cycle
Cycle-C1 Cycle-C2 
    "C1"     "C2" 

现在我可以像这样一一浏览这些元素:

mylist[[1]]=setNames(mylist[[1]], paste(names(mylist)[1], mylist[[1]], sep='-'))
mylist[[2]]=setNames(mylist[[2]], paste(names(mylist)[2], mylist[[2]], sep='-'))
...

但我不希望这样,因为列表可以有可变数量的元素和具有不同名称的子元素(这将进入一个接受不同初始数据帧的函数)。

哪种方法是实现此目的的最佳方法,最好使用

apply
函数?

我最好的尝试:

sapply(mylist, setNames, paste(names(mylist), mylist, sep='-'))

谢谢!

r list apply names
1个回答
0
投票

这应该可以做到:

lapply(
    setNames(names(mylist), names(mylist)),
    \(nm, l = mylist) setNames(l[[nm]], sprintf("%s-%s", nm, l[[nm]]))
)  
# $Patient
# Patient-Pat1 Patient-Pat2 Patient-Pat3 
#       "Pat1"       "Pat2"       "Pat3" 

# $Cycle
# Cycle-C1 Cycle-C2 
#     "C1"     "C2"
© www.soinside.com 2019 - 2024. All rights reserved.