2015-09-13 160 views
1

我有一个数据框列表,每列数据框都有几列。我的数据的一个例子是:数据框架列表 - 根据数据框架名称添加一个新列

Ind_ID<-rep(1:15) 
Mun<-sample(15) 
T_i<-paste0("D",rep(1:5)) 
data<-cbind(Ind_ID,Mun,T_i) 
data<-data.frame(data) 
mylist<-split(data,data$T_i) 
str(mylist) 

List of 5 
$ D1:'data.frame':  3 obs. of 3 variables: 
    ..$ Ind_ID: Factor w/ 15 levels "1","10","11",..: 1 12 3 
    ..$ Mun : Factor w/ 15 levels "1","10","11",..: 3 10 7 
    ..$ T_i : Factor w/ 5 levels "D1","D2","D3",..: 1 1 1 
$ D2:'data.frame':  3 obs. of 3 variables: 
    ..$ Ind_ID: Factor w/ 15 levels "1","10","11",..: 8 13 4 
    ..$ Mun : Factor w/ 15 levels "1","10","11",..: 14 11 5 
    ..$ T_i : Factor w/ 5 levels "D1","D2","D3",..: 2 2 2 
... 
$ D5:'data.frame':  3 obs. of 3 variables: 
    ..$ Ind_ID: Factor w/ 15 levels "1","10","11",..: 11 2 7 
    ..$ Mun : Factor w/ 15 levels "1","10","11",..: 4 12 2 
    ..$ T_i : Factor w/ 5 levels "D1","D2","D3",..: 5 5 5 

我想用相同的名称作为数据帧中添加一个新列。我的预期成果是:

$D1 
    Ind_ID Mun T_i D1 
1  1 11 D1 NA 
6  6 4 D1 NA 
11  11 15 D1 NA 

$D2 
    Ind_ID Mun T_i D2 
2  2 8 D2 NA 
7  7 5 D2 NA 
12  12 13 D2 NA 

.... 

$D5 
    Ind_ID Mun T_i D5 
5  5 12 D5 NA 
10  10 6 D5 NA 
15  15 10 D5 NA 

我的失败尝试包括:

nam<-as.list(names(mylist)) 
fun01 <- function(x,y){cbind(x, y = rep(1, nrow(x)))} 
a1<-lapply(mylist, fun01,nam) 
str(a1) # This generates a new column with the name "y" in all cases 

fun02 <- function(x,y){x= cbind(x, a = rep(1, nrow(x)));names(x)[4] <- y} 
a2<-lapply(mylist, fun02,nam) 
str(a2) # It changes the data frames 

任何帮助吗?在此先感谢

回答

2

你可以通过所有具有lapply调用dataframes循环,像这样的东西创建新列:

newlist = lapply(1:length(mylist), function(i){ 

    # Get the dataframe and the name 
    tmp_df = mylist[[i]] 
    tmp_name = names(mylist)[i] 

    # Create a new column with all NAs 
    tmp_df[,ncol(tmp_df) + 1] = NA 

    # Rename the newly created column 
    colnames(tmp_df)[ncol(tmp_df)] = tmp_name 

    # Return the df 
    return(tmp_df) 
}) 
+0

哇,这是快!非常感谢Lorenzo-Rossi – drgalindog

2

选择1:你可以使用Map()。首先,我们可以为迭代写一个小函数。

f <- function(df, nm) cbind(df, setNames(data.frame(NA), nm)) 
Map(f, mylist, names(mylist)) 

选项2:您可以惊险的生活,做

Map("[<-", mylist, names(mylist), value = NA) 
相关问题