2015-07-13 7 views
5

Ich habe zwei Datenrahmen DF1 und DF2:Neue Spalte im Datenrahmen mit einer for-Schleife erstellen, um den Wert in R zu berechnen?

group=c("Group 1", "Group 2", "Group3","Group 1", "Group 2", "Group3") 
year=c("2000","2000","2000", "2015", "2015", "2015") 
items=c("12", "10", "15", "5", "10", "7") 
df1=data.frame(group, year, items) 

year=c("2000", "2015") 
items=c("37", "22") 
df2=data.frame(year,items) 

df1 die Anzahl der Artikel pro Jahr enthält und von der Gruppe getrennt und DF2 enthält die Gesamtzahl der Sendungen pro Jahr

Ich versuche, Erstellen Sie eine for-Schleife, die den Anteil der Elemente für jeden Gruppentyp berechnet. Ich versuche, wie etwas zu tun:

df1$Prop="" #create empty column called Prop in df1 
for(i in 1:nrow(df1)){ 
    df1$Prop[i]=df1$items/df2$items[df2$year==df1$year[i]] 
} 

wo die Schleife soll der Anteil für jede Art von Element erhalten (durch den Wert von df1 bekommen und durch die Gesamt in df2 Dividieren) und geben Sie es in eine neue Spalte, aber dieser Code funktioniert nicht.

+1

nur eine Frage: warum der '" 'in dem' Elementen 'Vektor? Werte sind Zahlen in der Tat, aber mit Ihrer Syntax werden sie in Faktoren umgewandelt. – SabDeM

Antwort

4

Sie nicht df2 wirklich brauchen, ist hier eine einfache Lösung data.table verwenden und nur df1 (Ich bin assuimg items ist numerische Spalte, wenn nicht, you''ll müssen sie konvertieren einem setDT(df1)[, items := as.numeric(as.character(items))])

library(data.table) 
setDT(df1)[, Prop := items/sum(items), by = year] 
df1 
#  group year items  Prop 
# 1: Group 1 2000 12 0.3243243 
# 2: Group 2 2000 10 0.2702703 
# 3: Group3 2000 15 0.4054054 
# 4: Group 1 2015  5 0.2272727 
# 5: Group 2 2015 10 0.4545455 
# 6: Group3 2015  7 0.3181818 

Ein anderer Weg ist, wenn Sie bereits df2 haben, können Sie zwischen den beiden verbinden kann und Prop berechnen während dies zu tun (auch hier, ich bin items Annahme ist numerisch in realen Daten)

012.351.
setkey(setDT(df1), year)[df2, Prop := items/i.items] 

Eine Basis R alternative

with(df1, ave(items, year, FUN = function(x) x/sum(x))) 
## [1] 0.3243243 0.2702703 0.4054054 0.2272727 0.4545455 0.3181818 
+0

'Artikel' ist ein Faktor die Art und Weise @ shrimp32 schrieb das Beispiel. – christoph

+1

Ich weiß, ich sagte, ich nehme an, es ist ein Fehler und das ist eigentlich ein numerischer Wert. –

2

dplyr entspricht data.table Lösung David

library(dplyr) 

df1$items = as.integer(as.vector(df1$items)) 
df1 %>% group_by(year) %>% mutate(Prop = items/sum(items)) 

#Source: local data frame [6 x 4] 
#Groups: year 

# group year items  Prop 
#1 Group 1 2000 12 0.3243243 
#2 Group 2 2000 10 0.2702703 
#3 Group3 2000 15 0.4054054 
#4 Group 1 2015  5 0.2272727 
#5 Group 2 2015 10 0.4545455 
#6 Group3 2015  7 0.3181818 

plyr alternative

ddply(df1, .(year), mutate, prop = items/sum(items)) 

lapply alternative

do.call(rbind,lapply(split(df1, df1$year), 
     function(x){ x$prop = x$item/sum(x$item); x})) 
Verwandte Themen