首页 > 解决方案 > 在 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 b/c,但电气的更为普遍。

我已经在 R 中与此搏斗,但无法找到解决方法。将不胜感激任何帮助或建议。干杯。

标签: r

解决方案


假设您的数据框是df1df2,您可以使用以下tidyverse方法。

首先,用于pivot_longer将您的数据转换为更易于操作的长格式。用于left_join添加品牌电气化的相关年份。

我们可以创建一个指标mult,如果品牌已经上电,则该指标为 1,否则为 0。

然后,对于每一年,您可以通过将每个品牌的人气值乘以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

推荐阅读