В R, как объединить два фрейма данных, где имена столбцов в одном равны значениям строк в другом?

#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. Большое спасибо, это было очень поучительно и отлично решило мою проблему!