【问题标题】:Is there an R function for merging two dataframes by ratio是否有用于按比例合并两个数据帧的 R 函数
【发布时间】:2021-02-25 01:23:23
【问题描述】:

我有两个如下数据集。

df1=data.frame(o=c(1,1,1,1,2,2,2,2,3,3,3,3))
df2=data.frame(o=c(1,1,2,2,3,3), ratio=c(0.75,0.25,0.25,0.75,0.5,0.5),
               d=c('a','b','a','b','a','b'))

> df1
   o
1  1
2  1
3  1
4  1
5  2
6  2
7  2
8  2
9  3
10 3
11 3
12 3

> df2
  o ratio d
1 1  0.75 a
2 1  0.25 b
3 2  0.25 a
4 2  0.75 b
5 3  0.50 a
6 3  0.50 b

两个数据框中的“o”列中的值是相同的值。 我想通过数据帧中的“o”列和df2中的比率合并两个数据帧,如下所示(手工制作)。

> df_final
   o d
1  1 a
2  1 a
3  1 a
4  1 b
5  2 a
6  2 b
7  2 b
8  2 b
9  3 a
10 3 a
11 3 b
12 3 b

【问题讨论】:

标签: r dataframe join merge


【解决方案1】:

这是一个想法。我们可以先加入数据,计算每个字母的个数,根据长度创建列表,然后取消嵌套数据框。

library(dplyr)
library(tidyr)

df3 <- df2 %>%
  left_join(df1 %>% count(o), by = "o") %>%
  mutate(n2 = n * ratio) %>%
  rowwise() %>%
  mutate(d2 = list(rep(d, n2))) %>%
  unnest(cols = "d2") %>%
  select(o, d = d2)
df3
# # A tibble: 12 x 2
#      o d    
#  <dbl> <chr>
#  1     1 a    
#  2     1 a    
#  3     1 a    
#  4     1 b    
#  5     2 a    
#  6     2 b    
#  7     2 b    
#  8     2 b    
#  9     3 a    
# 10     3 a    
# 11     3 b    
# 12     3 b 

【讨论】:

  • 类似:df2 %&gt;% left_join(df1 %&gt;% count(o), by = "o") %&gt;% mutate(n = n * ratio) %&gt;% uncount(n) %&gt;% select(-ratio)
  • 非常感谢。你们救了我的命。
猜你喜欢
  • 2021-12-30
  • 2019-03-29
  • 2014-04-14
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多