2016-08-19 27 views
2

我有两个列表:一个包含具有不同长度的多个数据帧。对于每一个长度,我都有一个数组列表中的相应数组,现在我想将这些数组作为colnames应用于相同长度的向量。按照长度从一个列表匹配矢量到另一个列表中的数据帧

for (i in 1:10){ 
assign(paste0("var",i), c(1:10)) 
} 

df1 <- data.frame(var1,var2) 
df2 <- data.frame(var3,var4,var5) 
df3 <- data.frame(var6,var7,var8,var9) 
df4 <- data.frame(var10) 
df5 <- data.frame(var1,var2) 
df6 <- data.frame(var3,var4,var5) 
df7 <- data.frame(var6,var7,var8,var9) 
df8 <- data.frame(var10) 

my.list <- list(df1,df2,df3,df4) 

names1 <- c("aa","bb") 
names2 <- c("cc","dd","ee") 
names3 <- c("ff","gg","hh","ii") 
names4 <- c("jj") 

my.list.names <- list(names1,names2,names3,names4) 

for (i in 1:length(my.list)){ 
    if (length(my.list[[i]]) == length(my.list.names)) 
    colnames(my.list[[i]]) <- my.list.names 
} 

我可以看到为什么我的解决方案没有真正的工作。我不仅要检查my.list中的每个数据帧,还要检查my.list.names中的每个可能的向量,然后查看它们是否匹配。

我不能真正包裹这个“循环内的循环”的头。我也尝试过使用更优雅的解决方案。但是我最终还是以同样的观点。另外,如果最后缺少条件,似乎又有另一个条件,但似乎并没有像我之前指出的那样再次指定我写的内容似乎是正确的。

回答

1

你很接近 - 你只需要一个内部循环来检查列名的长度和分配他们,如果他们匹配数据帧的长度(列数):

for (i in seq_along(my.list)){ 
    for (cols in my.list.names){ 
    if(length(my.list[[i]]) == length(cols)) { 
     names(my.list[[i]]) <- cols 
    } 
    } 
} 

(另外,请注意您的总体方法 - 它假定在给定长度的my.list.names内只有一个向量,并且对于给定长度的每个数据帧至少存在一个列名称向量。)

0

只要列名向量的数量没有差距(即,不像1 varname,2 varnames,3 varnames,4 varnames, 6 varnames),其保持在该示例中,下面的解决方案能达到这个目的:

# put names into a list, assumes no other objects with "names" in their name 
namesList <- mget(ls(pattern="names")) 
# sort names by length, this assumes no gaps in column count 
namesList <- namesList[order(lengths(namesList))] 

# add names to list of data.frames 
my.list <- lapply(my.list, function(i) setNames(i, namesList[[length(i)]])) 

列表的第一个元素是

my.list[[1]] 
    aa bb 
1 1 1 
2 2 2 
3 3 3 
4 4 4 
5 5 5 
6 6 6 
7 7 7 
8 8 8 
9 9 9 
10 10 10 
相关问题