2016-07-11 13 views
0

Ich habe zur Zeit erstellt eine Reihe von Teilmengen von Daten, die ich Asub, B.sub, C.sub, etc. Ich möchte eine Schleife verwenden, um zu versuchen und eine hinzufügen Spalte zu jedem dieser Teilmengen basierend auf dem Spaltennamen in einem data.frame. Für einen Rahmen mit den Spaltennamen A, B, C möchte ich in der Lage sein, den [Spaltennamen] & sgr; (z. B. A, B, C) aufzurufen. Der Name des data.frames, aus dem ich die Spaltennamen zu zeichnen versuche, heißt SellList. Mein aktueller Versuch sieht wie folgt aus (Daten ein klareres Beispiel zu zeigen, vereinfacht, was ich versuche zu tun):Aufruf Teilmenge mit Spaltennamen in R

> SellList 
       A  B  C 
Sale Amount 30000 20000 10000 

> A.sub 
      Price Holdings $ Amt Owned 
      101.4  400  40560 

> B.sub 
      Price Holdings $ Amt Owned 
      95.5  300  28650 

> C.sub 
      Price Holdings $ Amt Owned 
      154.1  100  15450 

for(i in 1:width(SellList)){ 
    colnames(SellList[i]).sub$SaleAmount <- SellList[1,i] 
} 

Mit dem Ende Ziel der U-Boote, die wie folgt aussehen:

> A.sub 
      Price Holdings $AmtOwned SaleAmount 
      101.4  400  40560  30000 

> B.sub 
      Price Holdings $AmtOwned SaleAmount 
      95.5  300  28650  20000 

> C.sub 
      Price Holdings $AmtOwned SaleAmount 
      154.1  100  15450  10000 

Ein alternative Methode, die ich versucht habe, die Arbeit nicht zu sein scheint entweder alle der Untergruppen in einer Liste setzen und dann wie so durch die Liste ausgeführt wird:

for(i in length(list.level)){ 
    list.level[i].sub$SaleAmount <- SellList[1,i] 
} 

Antwort

-2
for(i in 1:length(names(SellList))){ 
    eval(parse(text = paste0(colnames(SellList)[i], ".sub$SaleAmount <- SellList[1,", i, "]")) 
} 

Getestet habe ich nur für i = 1
A.sub
Preis Holdings AmtOwned Umsatzbetrag
1 101,4 400 40560 30000

1

Wenn Sie die Teilmengen in eine Liste setzen, das ein Job für map2 in Paket sein könnte purrr. Die map2 Funktion ist, wenn Sie eine Funktion haben, die zwei separate Listen der gleichen Länge umfasst. Ich nannte die Liste der Teilmengen sublist.

sublist 
$A.sub 
    Price Holdings $ Amt Owned 
1 101.4  400  40560 

$B.sub 
    Price Holdings $ Amt Owned 
1 95.5  300  28650 

$C.sub 
    Price Holdings $ Amt Owned 
1 154.1  100  15450 

Jetzt können Sie map2 eine Schleife durch sublist und SellList nutzen und kombinieren. Da alle Ihre Variablen Zahlen sind, habe ich cbind verwendet, aber wenn Sie gemischte Typen hatten, könnten Sie data.frame mit verwenden.

library(purrr) 

map2(sublist, SellList, ~cbind(.x, SaleAmount = .y)) 

$A.sub 
    Price Holdings $ Amt Owned SaleAmount 
1 101.4  400  40560  30000 

$B.sub 
    Price Holdings $ Amt Owned SaleAmount 
1 95.5  300  28650  20000 

$C.sub 
    Price Holdings $ Amt Owned SaleAmount 
1 154.1  100  15450  10000 

verwendete ich die Tilde Kodierung des neuen Spalte SaleAmount, wobei .x. bezieht sich auf die erste Liste und .y bezieht sich auf die zweite Liste zu nennen.

Eine andere Alternative wäre, die Teilmengen in einem einzigen data.frame unter Verwendung map2_df zu binden. Mit den Argumenten .id wird eine Spalte hinzugefügt, um die Teilmengen zu identifizieren.

map2_df(sublist, SellList, ~cbind(.x, SaleAmount = .y), .id = "Sub") 

    Sub Price Holdings $ Amt Owned SaleAmount 
1 A.sub 101.4  400  40560  30000 
2 B.sub 95.5  300  28650  20000 
3 C.sub 154.1  100  15450  10000 
+0

Wie haben Sie die Liste der Teilmengen erhalten? Ich kann eine Liste ihrer Namen bekommen, aber nicht die Daten in ihnen. – Nick

+0

Ich habe sie beim Erstellen der Objekte fest in die benannte Liste geschrieben. Unter @lmo antwort finden Sie eine Option zum Einfügen von Datensätzen in eine Liste aus Ihrer Umgebung. – aosmith

0

Hier ist die Art, wie ich dies in der Basis R lösen würde:

# put .sub objects into a list 
myList <- mget(ls(pattern="\\.sub$")) 

# add on extra variable using lapply 
myList <- lapply(seq_along(myList), 
       function(i) c(myList[[i]], "SaleAmount"=sellList[[i]][1L])) 

Dies wird wieder eine verschachtelte Liste, wo die äußere Nest Namen der A.sub, B.sub, C.sub hat , und die inneren Listen sollten wie in Ihrem Beispiel aussehen. Beachten Sie, dass dazu die Objekte wie im Beispiel benannt und organisiert sein müssen.

Verwandte Themen