我做了几次尝试将特定列添加到数据帧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=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")
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)
尝试 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.
| 归档时间: |
|
| 查看次数: |
54 次 |
| 最近记录: |