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 b/c,但电气的更为普遍。
我已经在 R 中与此搏斗,但无法找到解决方法。将不胜感激任何帮助或建议。干杯。
解决方案
假设您的数据框是df1
和df2
,您可以使用以下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
推荐阅读
- amazon-web-services - AWS Cloudwatch 警报状态更改延迟
- oracle - 创建 Oracle 视图以根据条件比较数据
- wpf - IValueConverter 对 DateTime 使用了错误的区域性
- r - 在 R 中使用循环绘制数据
- ios - 如何在Swift中将视图控制器的值访问到tableview中的tableview中
- php - MySQL 5.7 character_set_client 堆栈在 utf8mb4
- c++ - 为什么 Visual Studio 在 .NET Framework 包安装后会中断?
- ruby - on_entry、from、event_args 键在 ruby 工作流程中表示什么?
- qt - 如何禁用小部件的抗锯齿?
- r - 使用 geom_text() 用数值标记上下置信区间条