R:如何在 lapply 函数中获取元素的名称?

标签 r

假设我有一个 data.frames 列表:

list <- list(A=data.frame(x=c(1,2),y=c(3,4)), B=data.frame(x=c(1,2),y=c(7,8)))

我想像这样将它们组合成一个 data.frame:

data.frame(x=c(1,2,1,2), y=c(3,4,7,8), group=c("A","A","B","B"))
  x y group
1 1 3     A
2 2 4     A
3 1 7     B
4 2 8     B

我可以这样做:

add_group_name <- function(df, group) {
  df$group <- group
  df
}    
Reduce(rbind, mapply(add_group_name, list, names(list), SIMPLIFY=FALSE))

但我想知道是否可以在不使用 names(list) 的情况下在 lapply 循环中获取名称,就像这样:

add_group_name <- function(df) {
  df$group <- ? #How to get the name of df in the list here?
}
Reduce(rbind, lapply(list, add_group_name))

最佳答案

我将 list 重命名为 listy 以消除与基本函数的冲突。这实质上是 Señor O 的回答的变体:

do.call(rbind, Map("[<-", listy, TRUE, "group", names(listy) ) )

#    x y group
#A.1 1 3     A
#A.2 2 4     A
#B.1 1 7     B
#B.2 2 8     B

这也与之前的问答非常相似:r function/loop to add column and value to multiple dataframes

内部 Map 部分给出了这个结果:

Map("[<-", listy, TRUE, "group", names(listy) )

#$A
#  x y group
#1 1 3     A
#2 2 4     A
#
#$B
#  x y group
#1 1 7     B
#2 2 8     B

...为了便于解释,可以这样写:

Map(function(data, nms) {data[TRUE,"group"] <- nms; data;}, listy, names(listy) )

正如@flodel 所建议的,您还可以使用 R 内置的 transform 函数来更新数据帧,这可能会再次变得更简单:

do.call(rbind, Map(transform, listy, group = names(listy)) )

关于R:如何在 lapply 函数中获取元素的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25879101/

相关文章:

r - 查找具有唯一值组合的行 (R)

R如何通过创建新列在一行中写入可变数量的具有相同属性的行

替换值

r - 使用 JuliaCall 将 NA 从 R 传递给 Julia 函数

R:如何使用随机森林来使用字符串变量预测二元结果?

r - 如何纠正添加到所有输入特征中的大(未知)常数的线性回归?

windows - 使用 git 和 curl 命令行

r - 如何从 pls 模型中解释 y 方差

r - Plotly - 用 R 发布我的 plotly

performance - 避免在 R 中按行处理 data.frame