#r
#r
Вопрос:
Допустим, у меня есть один фрейм данных брендов зубных щеток и показатель того, насколько они популярны с течением времени:
year brand_1 brand_2
2010 0.7 0.3
2011 0.6 0.6
2012 0.4 0.9
И еще один, в котором говорится, когда каждая марка зубной щетки стала электрической, что NA
означает, что они никогда этого не делали:
brand went_electrical_year
brand_1 NA
brand_2 2011
Теперь я хотел бы объединить их, чтобы получить распространенность марок электрических зубных щеток (в процентах от общего числа) каждый год:
year electrical_prevalence
2010 0
2011 0.5
2012 0.69
В 2010 году это 0 b / c, ни одна из марок не является электрической. В 2011 году это 0,5 b / c, и они одинаково распространены. В 2012 году это 0,69 бит / с, но электрический более распространен.
Я боролся с этим в R, но не могу найти способ сделать это. Был бы признателен за любую помощь или предложения. Приветствия.
Комментарии:
1. Можете ли вы добавить
year
, что они стали электрическими, в первый фрейм данных? Можете ли вы написать формулу для вычисленияelectrical_prevalence
? После этого вы можете вычислить из года?
Ответ №1:
Предполагая, что ваши фреймы данных являются df1
и df2
, вы можете использовать следующий tidyverse
подход.
Во-первых, используйте pivot_longer
для перевода ваших данных в длинный формат, которым будет легче манипулировать. Используется left_join
для добавления соответствующих лет, когда бренды стали электрическими.
Мы можем создать индикатор mult
, который будет равен 1, если бренд стал электрическим, или нулю, если этого не произошло.
Затем для каждого года вы можете определить пропорцию, умножив значение популярности на mult
для каждого бренда, а затем разделив на общую сумму за этот год.
library(tidyverse)
df1 %>%
pivot_longer(cols = -year) %>%
left_join(df2, by = c("name" = "brand")) %>%
mutate(mult = ifelse(went_electrical_year > year | is.na(went_electrical_year), 0, 1)) %>%
group_by(year) %>%
summarise(electrical_prevalence = sum(value * mult) / sum(value))
Вывод
year electrical_prevalence
<int> <dbl>
1 2010 0
2 2011 0.5
3 2012 0.692
Комментарии:
1. Большое спасибо, это было очень поучительно и отлично решило мою проблему!