2016-08-19 30 views
2

2つのリストがあります.1つは長さの異なる複数のデータフレームを含んでいます。それぞれの長さに対して、配列のリストに対応する配列があり、今はこれらの配列を同じ長さのベクトルに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の各ベクトルにも対応し、一致するかどうかを確認する必要があります。

私はこの「ループの中のループ」の周りを頭で覆うことはできません。私はapplyでより洗練されたソリューションを試しました。しかし、私は同じ時点で終わります。また、もう一つのif条件が最後に欠落しているようですが、前のステートメントと同じように私が書いたものをもう一度指定するのは正しいとは思われません。

答えて

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内に1つのベクトルしか存在せず、与えられた長さの各データフレームに対して少なくとも1つの列名のベクトルが存在することを前提としています)。

0

列名ベクトルの数にはギャップがありません(つまり、1つのvarname、2つのvarnames、3つのvarnames、4つの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 
ある:6 varnames)、例で保持し、以下の解決策は、トリックを行う必要があります
関連する問題