我做了几次尝试将特定列添加到数据框中。列表中的列表,但所有 *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
我想要列表名称的首字母作为第二个
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
但是内部列表已经失去了它们的名字。选项
USE.NAMES=TRUE
来自 lapply()
文档不起作用。我也试过这两种尝试,但他们失败得更糟。
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")
我知道我可以这样做:
l1 <- lapply(seq_along(l), function(x) cbind(l[[x]], id=substr(names(l)[x], 1, 1)))
names(l1) <- names(l)
或做一个
for
环形:for(i in seq_along(l)) {
l[[i]] <- data.frame(l[[i]], id=substr(names(l)[i], 1, 1))
}
但我想知道是否是
*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
最佳答案
试试 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
第一个参数是一个函数。
Map
然后将函数“应用于每个...参数的第一个元素,第二个元素,第三个元素,依此类推。”,参见 ?mapply
.
关于r - 如何在不丢失名称的情况下向列表中的列表添加列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53711248/