我发现了这个问题,但它似乎对我不起作用。
任务很简单。我有一个从数据框中获得的如下列表,我想
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='-'))
谢谢!
这应该可以做到:
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"