2015-07-13 11 views
5

Mam dwie ramki danych DF1 i df2:Utwórz nową kolumnę w ramce danych za pomocą pętli for, aby obliczyć wartość w R?

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 zawiera liczbę elementów rocznie i oddzielone przez grupy i df2 zawiera całkowitą liczbę pozycji rocznie

Próbuję utwórz pętlę for, która obliczy proporcję elementów dla każdego typu grupy. Próbuję zrobić coś takiego:

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]] 
} 

gdzie pętla ma się proporcję dla każdego typu elementu (poprzez uzyskanie wartości z DF1 i dzieląc przez całkowitą w DF2) i wymienić je w nowa kolumna, ale ten kod nie działa.

+1

tylko pytanie: dlaczego '' 'w wektorze' items'? wartości są liczbami, ale z twoją składnią są przeliczane na czynniki. – SabDeM

Odpowiedz

4

Nie trzeba df2 naprawdę tutaj jest proste rozwiązanie za pomocą data.table i tylko df1 (jestem assuimg items jest kolumna numeryczna, jeśli nie, you''ll trzeba konwertować go do jednego 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 

Innym sposobem jest, jeśli masz już df2 można przyłączyć między nimi i obliczyć Prop robiąc tak (ponownie, jestem przy założeniu items jest numeryczne w rzeczywistych danych)

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

Podstawa R alternatywny

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

'items' jest czynnikiem tak, jak @ shrimp32 napisał przykład. – christoph

+1

Wiem, powiedziałem, że zakładam, że to pomyłka i to w rzeczywistości wartość liczbowa. –

2

dplyr równoważne Dawida data.table roztworu

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 alternatywnym

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

lapply alternatywa

do.call(rbind,lapply(split(df1, df1$year), 
     function(x){ x$prop = x$item/sum(x$item); x})) 
Powiązane problemy