r - 如何在不丢失名称的情况下向列表中的列表添加列?

标签 r list lapply

我做了几次尝试将特定列添加到数据框中。列表中的列表,但所有 *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/

相关文章:

r - 如何从R中的两列同时采样?

string - 如何将变量(对象)名称转换为字符串

python - 如何按 pandas 中的列进行分组并根据列值应用 ifelse

Python 在 for 循环之外获取修改后的列表

r - R 中列表对象与 apply 函数之间的操作

R cut函数以中位数作为标签而不是界限

r - 如何减少 tableOutput Shiny 中的行高?

python - 使用 subprocess 命令调用 R 脚本,但 r 脚本中的 Library() 命令阻止它运行

python - 为什么集合比 python 中的列表大?

android - 将现有列表转换为json/文本文件,以便向前读取该文件中的数据以生成列表