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

时间:2014-09-16 21:59:48

标签: 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))

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

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))

3 个答案:

答案 0 :(得分:2)

我认为更简单的方法是:

> do.call(rbind, lapply(names(list), function(x) data.frame(list[[x]], group = x)))
  x y group
1 1 3     A
2 2 4     A
3 1 7     B
4 2 8     B

答案 1 :(得分:2)

使用plyr

 ldply(ll)
  .id x y
1   A 1 3
2   A 2 4
3   B 1 7
4   B 2 8

或分2步:

xx <- do.call(rbind,ll)
xx$group <- sub('([A-Z]).*','\\1',rownames(xx))
 xx
    x y group
A.1 1 3     A
A.2 2 4     A
B.1 1 7     B
B.2 2 8     B

答案 2 :(得分:2)

我将list重命名为listy以删除与基本功能的冲突。这是SeñorO答案的一个变体:

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)) )