2017-06-23 6 views
1

同じループプロセス内でネストされたforループで呼び出され、名前が変更されたいくつかのデータフレームの3番目の列を結合しようとしています。R:ループ内のネストされたループのすべてのデータフレームの特定の列をどのようにバインドできますか?

# Sample Data 
ecvec_msa6_1998=matrix(round(rnorm(200, 5,15)), ncol=4) 
ecvec_msa6_1999=matrix(round(rnorm(200, 4,16)), ncol=4) 
ecvec_msa6_2000=matrix(round(rnorm(200, 3,17)), ncol=4) 

datasets=c("msa") 
num_industrys=c(6) 
years=c(1998, 1999, 2000) 

alist=list() 

for (d in 1:length(datasets)) { 
    dataset=datasets[d] 
    for (n in 1:length(num_industrys)){ 
    num_industry=num_industrys[n] 
    for (y in 1:length(years)) { 
     year=years[y] 

    eval(parse(text=paste0("newly_added = ecvec_", dataset, num_industry, "_", year))) 
    # renaming the old data frames 

    alist = list(alist, newly_added) # combining them in a list 

    extracted_cols <- lapply(alist, function(x) x[3]) # selecting the third column 

    result <- do.call("cbind", extracted_cols) # trying to cbind the third colum 

    } 
    } 
} 

誰かが私にこれを行う正しい方法を示すことができますか?

答えて

0

あなたのコードはほぼ動作します - ここにされているいくつかの変更を...

alist=list() 

for (d in 1:length(datasets)) { 
    dataset=datasets[d] 
    for (n in 1:length(num_industrys)){ 
    num_industry=num_industrys[n] 
    for (y in 1:length(years)) { 
     year=years[y] 
     eval(parse(text=paste0("newly_added = ecvec_", dataset, num_industry, "_", year)))         
     #the next line produces the sort of list you want - yours was too nested 
     alist = c(alist, list(newly_added)) 
    } 
    } 
} 

#once you have your list, these commands should be outside the loop   
extracted_cols <- lapply(alist, function(x) x[,3]) #note the added comma! 
result <- do.call(cbind, extracted_cols) #no quotes needed around cbind 

head(result) 
    [,1] [,2] [,3] 
[1,] 11 13 24 
[2,] -26 -3 7 
[3,] -1 -26 -14 
[4,] 5 14 -15 
[5,] 28 3 8 
[6,] 9 -9 19 

- しかし、これを行うのはるかR-ような(そして速い)方法は

で上記のすべてを置き換えることであろう
df <- expand.grid(datasets,num_industrys,years) #generate all combinations 
datanames <- paste0("ecvec_",df$Var1,df$Var2,"_",df$Var3) #paste them into a vector of names 
result <- sapply(datanames,function(x) get(x)[,3]) 

sapplyそれは(lapplyは常にリストを作成する)

+0

ありがとうございます。最初の解決策は私が必要としていたものです。 しかし、2つ目の解決策はおそらく私の目標には役に立たないでしょう。なぜなら、私が結合するデータフレーム(単一の列)の数にできるだけ柔軟に対応したいからです – BeSeLuFri

0

各データフレームの3番目の列を抽出して新しいものに結合するだけですか?

newdata <- cbind(ecvec_msa6_1998[,3],ecvec_msa6_1999[,3],ecvec_msa6_2000[,3])

1

は、多くの場合、Rで、ネストされたループを回避することをお勧めします:

See Circle 2 of R's Infernohereを。パトリック・バーンズは、最初のリンク(P。14)でそれを行っているよう

たぶん、あなたはリストでこの部分に

 extracted_cols <- lapply(alist, function(x) x[3]) # selecting the third column 

    result <- do.call("cbind", extracted_cols) # trying to cbind the third colum 

を交換してみてください。それはもっときれいかもしれない。

+1

クリーンで非常に効率的なことができた場合、自動的にデータフレームの中にリストを簡素化します!私はそれが好きです。 – user3720887

関連する問題