2016-07-21 15 views
0

Ich habe zwei Datenrahmen. In der letzten Spalte ("Rechnung") im ersten Datenrahmen möchte ich eine Funktion anwenden (Festpreis + Menge * Preis/Menge). Um die Funktion anzuwenden, sollte R die Werte in der ersten Spalte von df1 mit den Spaltennamen von df2 vergleichen.Felder in einem Datenrahmen mit Spaltennamen in einem anderen Datenrahmen zusammenpassen

Ich habe das Problem gelöst, indem ich eine Funktion und mehrere ifelse-Anweisungen erstellt habe, aber ich möchte eine Anweisung verwenden, die die Werte in df1 automatisch mit den Spaltennamen in df2 vergleicht. Der Datensatz, den ich habe, enthält mehr als 2 Millionen Zeilen, und ich müsste die gleichen Gründe für den Aufbau anderer ähnlicher Funktionen anwenden. Es wäre schön, etwas zu verwenden, das keine Schleife benötigt oder zu lange dauert.

see what the data frame should look like here

+2

gewürdigt werden würde, wenn Sie Code schreiben könnte, dass diese Datenrahmen macht, so macht es der Prozess reproduzierbar. –

+0

Bitte verwenden Sie nur das 'rstudio'-Tag, wenn Ihre Frage den RStudio-Code-Editor betrifft. Wenn Sie eine Frage zur Grammatik stellen, verwenden Sie kein "Stift-und-Papier" -Tag. – Gregor

Antwort

1
### Set up your data frames like so ### 
Code <- c("a1", "a2", "c3", "a1") 
Name <- c("Dan", "David", "Anna", "Lisa") 
Quantity <- c(30, 12, 10, 10) 

df1 <- as.data.frame(cbind("Code" = Code, "Name" = Name, "Quantity" = Quantity), stringsAsFactors = F) 
df1$Quantity <- as.numeric(df1$Quantity) 

fixed_price <- c(12, 5, 23) 
price_per_qty <- c(1, 4, 7) 

df2 <- as.data.frame(rbind("fixed_price" = fixed_price, "price_per_qty" = price_per_qty)) 
colnames(df2) <- c("a1", "a2", "c3") 

### Combine dataframe 1 and 2 into a single dataframe ### 

# Code below pulls individual columns from df2 based on the 
# index provided by the "Code" column in df1, transposes them 
# so they'll line up with df1, then column binds them to df1 
df3 <- cbind(df1, t(df2[,df1$Code])) 

# the bill is calculated simply enough 
bill <- df3[4] + df3[3] * df3[5] 
colnames(bill) <- "bill" 
# Finally, output the results as you wanted 
cbind(df3, bill) 
+0

Schöne Art der Verwendung der Cbind-Funktion und Indexierung mit dem DF1 $ Code –

+0

Dies war sehr nützlich. Vielen Dank. – Irina

0

So habe ich eine ziemlich ähnliche Antwort auf graggsd, aber hier ist das, was für mich gearbeitet. Ich habe zwei Datenrahmen basierend auf dem Schlüsselwort "Code" zusammengeführt und dann in den großen Datenrahmen zu combined_data kombiniert. Ich habe dann eine Funktion benutzt, die ich oben definiert habe und dann die entsprechenden Datenrahmen durchgelassen habe.

df2 <- t(data.frame(c(12,1),c(5,4),c(23,7))) 
rownames(df2) <- c("a1","a2","c3") 
test <- rownames(df2) 
df2 <- cbind.data.frame(df2,test) 
colnames(df2) <- c("fixed price","price/qty","Code") 


df1 <- data.frame(c("a1","a2","c3","a1"), c("Dan","David","Anna","Lisa"),c(30,12,10,10)) 
colnames(df1) <- c("Code","Name","Quantity") 


combined_data <- dplyr::inner_join(df1,df2, by = "Code") 



f1 <- function(x,y,z){ 
    x + y * z 
} 
bill <- f1(combined_data[,4],combined_data[,3],combined_data[,5]) 

finalDataSet <- cbind.data.frame(combined_data,bill) 

Der letzte Datensatz:

Code Name Quantity fixed price price/qty bill 
1 a1 Dan  30   12   1 42 
2 a2 David  12   5   4 53 
3 c3 Anna  10   23   7 93 
4 a1 Lisa  10   12   1 22 
Verwandte Themen