2015-10-18 2 views
1

Я хочу рассчитать процентные значения для столбца data.frame на основе критерия столбца другого объекта, используя проценты другого df. Вот несколько примеров данных:R: Как выполнить (пользовательский) расчет на основе критериев столбца и процентных значений другого df?

df <- data.frame(Value = c(50,10,30,40), 
        object = c("apples","tomatoes", "apples","pears")) 

и объект доли с процентами для объектов:

share <- data.frame(object = c("tomatoes","pears", "apples"), 
        percentage = c(90,75,80)) 

Мой ожидаемый результат:

Value object 
1 40 apples 
2  9 tomatoes 
3 24 apples 
4 30 pears 

С только один объект, я использовал этот код, который отлично работает:

df[,1] <- df$Value * share$percentage /100 

Но как выполнить это для разных объектов в df/share? «агрегация»/«подмножество» или что-то в этом роде?

EDIT: Я попытался это так далеко, что я думаю, что это может быть так:

df[,1] <- aggregate(df$Value, by=df$object,FUN= function(x) {x$Value * share$percentage /100} ) 

и

df[,1] <- apply(split(df, df$object) function(x) {x$Value * share$percentage/100}) 

Однако функция кажется неправильным (я м и не очень знакомы с функциями :). Обратите внимание, что я не хочу сначала объединять df с share, так как мне нужна оригинальная структура df и порядка. Поэтому я ищу короткую команду. Я очень ценю ваши идеи. Thanks

ответ

0

Вы хотите получить средневзвешенное значение?

library(dplyr) 

df %>% 
    inner_join(share) %>% 
    group_by(object) %>% 
    summarize(weighted_average = 
       sum(Value * percentage)/sum(percentage)) 
+0

Это обеспечивает только среднее значение для каждого продукта, но не для исходного df (см. Мой ожидаемый результат, df имеет 4 объекта и вы производите только три уровня в df) –

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