2017-06-23 5 views
1

Ich versuche, die dritte Spalte von mehreren Datenrahmen, die in einer verschachtelten for-Schleife aufgerufen und umbenannt werden, innerhalb des gleichen Schleife-Prozesses zu kombinieren.R: Wie kann ich bestimmte Spalten aller Datenrahmen einer verschachtelten Schleife innerhalb der Schleife binden?

# 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 

    } 
    } 
} 

Kann jemand mir den richtigen Weg zeigen, dies zu tun?

Antwort

0

Ihr Code fast funktioniert - hier ein paar Änderungen sind ...

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 

JEDOCH - ein viel R-like (und schneller) Weg, dies zu tun mit

alle oben zu ersetzen wäre
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 vereinfacht automatisch die Liste in einen Datenrahmen, wenn er kann

+0

Danke. Die erste Lösung ist genau das, was ich brauchte. Ihre zweite Lösung würde aber wahrscheinlich meinen Zielen nicht helfen, weil ich so flexibel wie möglich in der Anzahl der Datenrahmen (einzelne Spalten) sein möchte, die ich kombiniere – BeSeLuFri

0

Möchten Sie einfach die dritten Spalten von jedem Datenrahmen in einen neuen extrahieren und kombinieren?

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

1

Oft ist es empfehlenswert, verschachtelte Schleifen in R zu vermeiden:

See Circle 2 of R's Inferno oder here.

Vielleicht sollten Sie versuchen, diesen Teil

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

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

mit einer Liste zu ersetzen, wie Patrick Burns es in dem ersten Link (p. 14) getan hat. Es könnte auch viel sauberer sein.

+1

Sauber und extrem effizient (lapply immer eine Liste erzeugt)! Ich mag das. – user3720887

Verwandte Themen