List 列表中的数据帧;添加名为dataframe的新变量

List 列表中的数据帧;添加名为dataframe的新变量,list,r,dataframe,names,lapply,List,R,Dataframe,Names,Lapply,我有一个数据帧列表,我最终希望合并这些数据帧,同时保留它们原始数据帧名称或列表索引的记录。这将允许我在所有行中子集etc。为了实现这一点,我想向每个数据帧添加一个新变量“id”,它包含它所属的数据帧的名称/索引 编辑:“在我的真实代码中,数据帧变量是通过使用以下代码读取多个文件创建的,因此我没有实际名称,只有“files.to.read”列表中的那些,我不确定它们是否与数据帧顺序对齐: mylist <- llply(files.to.read, read.csv) mylistname

我有一个数据帧列表,我最终希望合并这些数据帧,同时保留它们原始数据帧名称或列表索引的记录。这将允许我在所有行中子集etc。为了实现这一点,我想向每个数据帧添加一个新变量“id”,它包含它所属的数据帧的名称/索引

编辑:“在我的真实代码中,数据帧变量是通过使用以下代码读取多个文件创建的,因此我没有实际名称,只有“files.to.read”列表中的那些,我不确定它们是否与数据帧顺序对齐:

mylist <- llply(files.to.read, read.csv)
mylist
names()
可以使用它它有名称,但您没有给它任何名称。它是一个未命名的列表。您需要使用数字索引:

> for(i in 1:length(mylist) ){ mylist[[i]] <- cbind(mylist[[i]], id=rep(i, nrow(mylist[[i]]) ) ) }
> mylist
[[1]]
  x  y id
1 1 11  1
2 2 12  1
3 3 13  1
4 4 14  1
5 5 15  1

[[2]]
  x  y id
1 1 11  2
2 2 12  2
3 3 13  2
4 4 14  2
5 5 15  2
>for(i in 1:length(mylist)){mylist[[i]]mylist
[[1]]
x y id
1 1 11  1
2 2 12  1
3 3 13  1
4 4 14  1
5 5 15  1
[[2]]
x y id
1 1 11  2
2 2 12  2
3 3 13  2
4 4 14  2
5 5 15  2

您的第一次尝试非常接近。通过使用索引而不是值,它将起作用。您的第二次尝试失败,因为您没有命名列表中的元素

下面的两种解决方案都使用了这样一个事实,即
lappy
可以向函数传递额外的参数(mylist)

df1 <- data.frame(x=c(1:5),y=c(11:15))
df2 <- data.frame(x=c(1:5),y=c(11:15))
mylist <- list(df1=df1,df2=df2) # Name each data.frame!
# names(mylist) <- c("df1", "df2") # Alternative way of naming...

# Use indices - and pass in mylist
mylist1 <- lapply(seq_along(mylist), 
        function(i, x){
            x[[i]]$id <- i
            return (x[[i]])
        }, mylist
)

# Now the names work - but I pass in mylist instead of using portfolio.results.
mylist2 <- lapply(names(mylist), 
    function(n, x){
        x[[n]]$id <- n
        return (x[[n]])
    }, mylist
)

df1就个人而言,我认为在折叠后添加名称更容易:

df1 <- data.frame(x=c(1:5),y=c(11:15))
df2 <- data.frame(x=c(1:5),y=c(11:15))
mylist <- list(df1 = df1, df2 = df2)

all <- do.call("rbind", mylist)
all$id <- rep(names(mylist), sapply(mylist, nrow))

df1dlply函数形式plyr包可能是一个答案:

library('plyr')
df1 <- data.frame(x=c(1:5),y=c(11:15))
df2 <- data.frame(x=c(1:5),y=c(11:15))
mylist <- list(df1 = df1, df2 = df2)

all <- ldply(mylist)
library('plyr')

df1谢谢我不确定折叠是否会保留顺序。我折叠列表是为了使用qplot()并通过$id指定子集。但是,折叠速度非常慢,因此我可以选择其他选项。哇,我使用了rbind()而不是merge_recurse()在我的实际代码中,总时间从10分钟减少到10秒。感谢您回答这两个问题。我编辑了我的问题,说明我没有名字,但我确实有。将files.to.read转换为列表允许我为每个列表元素分配相应的名称,前提是它们正确对齐…我没有看到森林树!谢谢。在汤米、哈德利和你之间,我已经创造了一个合适的解决方案。我最终希望在接下来的过程中识别出这些名字。
> for(i in 1:length(mylist) ){ mylist[[i]] <- cbind(mylist[[i]], id=rep(i, nrow(mylist[[i]]) ) ) }
> mylist
[[1]]
  x  y id
1 1 11  1
2 2 12  1
3 3 13  1
4 4 14  1
5 5 15  1

[[2]]
  x  y id
1 1 11  2
2 2 12  2
3 3 13  2
4 4 14  2
5 5 15  2
df1 <- data.frame(x=c(1:5),y=c(11:15))
df2 <- data.frame(x=c(1:5),y=c(11:15))
mylist <- list(df1=df1,df2=df2) # Name each data.frame!
# names(mylist) <- c("df1", "df2") # Alternative way of naming...

# Use indices - and pass in mylist
mylist1 <- lapply(seq_along(mylist), 
        function(i, x){
            x[[i]]$id <- i
            return (x[[i]])
        }, mylist
)

# Now the names work - but I pass in mylist instead of using portfolio.results.
mylist2 <- lapply(names(mylist), 
    function(n, x){
        x[[n]]$id <- n
        return (x[[n]])
    }, mylist
)
df1 <- data.frame(x=c(1:5),y=c(11:15))
df2 <- data.frame(x=c(1:5),y=c(11:15))
mylist <- list(df1 = df1, df2 = df2)

all <- do.call("rbind", mylist)
all$id <- rep(names(mylist), sapply(mylist, nrow))
library('plyr')
df1 <- data.frame(x=c(1:5),y=c(11:15))
df2 <- data.frame(x=c(1:5),y=c(11:15))
mylist <- list(df1 = df1, df2 = df2)

all <- ldply(mylist)