如何将列添加到列表中的列表而不会丢失其名称?

jay*_*.sf 4 r list lapply

我做了几次尝试将特定列添加到数据帧resp.列表中的列表,但所有*apply()尝试都未能保留数据帧的名称.

例如列表l,

l <- list(alpha=data.frame(1:3), bravo=data.frame(4:6), charly=data.frame(7:9))

> l
$`alpha`
  X1.3
1    1
2    2
3    3

$bravo
  X4.6
1    4
2    5
3    6

$charly
  X7.9
1    7
2    8
3    9
Run Code Online (Sandbox Code Playgroud)

我想将列表名称的首字母作为第二id列.我试过这些尝试基本上给了我我想要的东西:

lapply(seq_along(l), function(x) cbind(l[[x]], id=substr(names(l)[x], 1, 1)))
# or
lapply(seq_along(l), function(x) data.frame(l[[x]], id=substr(names(l)[x], 1, 1)))
# [[1]]
# X1.3 id
# 1    1  a
# 2    2  a
# 3    3  a
# 
# [[2]]
# X4.6 id
# 1    4  b
# 2    5  b
# 3    6  b
# 
# [[3]]
# X7.9 id
# 1    7  c
# 2    8  c
# 3    9  c
Run Code Online (Sandbox Code Playgroud)

但是内部名单已经失去了名字.选项USE.NAMES=TRUElapply()文档中没有工作.

我也尝试了这两次尝试,但是他们的失败甚至更糟.

lapply(seq_along(l), function(x) mapply(cbind, l[[x]], id=substr(names(l)[x], 1, 1), 
                                        SIMPLIFY=FALSE))
rapply(l, function(x) cbind(x, id=substr(names(l)[x], 1, 1)), how="list")
Run Code Online (Sandbox Code Playgroud)

我知道我可以这样做:

l1 <- lapply(seq_along(l), function(x) cbind(l[[x]], id=substr(names(l)[x], 1, 1)))
names(l1) <- names(l)
Run Code Online (Sandbox Code Playgroud)

或做一个for循环:

for(i in seq_along(l)) {
  l[[i]] <- data.frame(l[[i]], id=substr(names(l)[i], 1, 1))
}
Run Code Online (Sandbox Code Playgroud)

但我想知道是否*apply()可以改进解决方案以带来预期的输出,这将是:

$`alpha`
  X1.3 id
1    1  a
2    2  a
3    3  a

$bravo
  X4.6 id
1    4  b
2    5  b
3    6  b

$charly
  X7.9 id
1    7  c
2    8  c
3    9  c
Run Code Online (Sandbox Code Playgroud)

mar*_*kus 5

尝试 Map

Map(`[<-`, l, "id", value = substr(names(l), 1, 1))
#$alpha
#  X1.3 id
#1    1  a
#2    2  a
#3    3  a

#$bravo
#  X4.6 id
#1    4  b
#2    5  b
#3    6  b

#$charly
#  X7.9 id
#1    7  c
#2    8  c
#3    9  c
Run Code Online (Sandbox Code Playgroud)

第一个参数是一个函数.Map然后将函数"应用于每个...参数的第一个元素,第二个元素,第三个元素,依此类推.",请参阅?mapply.