2017-02-16 3 views
1

У меня есть dataframe частот слов, таких как:Рассчитайте пропорции группы мудр из dataframe

df <- data.frame(
    Predictor = c("for","of","as","for","for","as","of","of","as","for"), 
    ToPredict = c("sure","course","much","him","keeps","far","them","this","an","petes"), 
    Freq = c(53,32,21,17,13,5,3,2,2,1)) 

Я хочу, чтобы вычислить новый столбец, доля, что каждый ToPredict составляет от каждого предиктора.

Так, в приведенном выше примере, значения для этого нового столбца будет:

df$Props = c(0.631,0.865,0.75,0.202,0.155,0.179,0.081,0.054,0.071,0.012) 

На данный момент у меня есть dataframe сумм:

sums <- aggregate(df$Freq, by=list(Category=df$Predictor), FUN=sum) 

и я попытался:

df$Props <- with(df, Freq/sums$x[which(sums$Category == Predictor)]) 

Очевидно, что это не работает. Но я не знаю, что будет. Любая помощь очень ценится.

+1

У меня закрадывается подозрение, что это дубликат вопрос, но 'с (Д.Ф., пр (Freq, Предсказатель, FUN = prop.table))' должны сделай это. – thelatemail

+0

Возможные дубликаты кандидатов, хотя ответы не велики - http://stackoverflow.com/questions/15009011/calculate-proportions-within-subsets-of-a-data-frame и http://stackoverflow.com/questions/26885819/calculate-ratio-by-groups-for-a-subset-of-the-dataset – thelatemail

+0

Вполне возможно, что это так. Тем не менее, я не мог найти ответ с довольно большим количеством поисков. Ваше решение работает. Спасибо! – davo1979

ответ

1
a=aggregate(df$Freq, by=list(df$Pred), FUN=sum) 
a1=a[,2] 
names(a1)=as.character(a[,1]) 
df$Props=df$Freq/a1[df$Pred] 
+0

Это тоже работает. И более интуитивно для меня (хотя я бы представлял себе медленнее, так как он создает дополнительный вектор). Тем не менее, я не могу принять свой ответ (thelatemail) (по крайней мере, не сразу). Так что это сработает. – davo1979

Смежные вопросы