如果值位于多列

时间:2018-03-11 21:55:12

标签: r join merge

我想加入两个数据框(df1df2),具体取决于df1中的某个值是否位于{{1}中的多列中的一列中}。

例如:

df2

但是,在#create df1 year <- c(2017, 2017, 2016, 2016, 2015, 2015) person1 <- c('sam', 'sarah', 'sally', 'kat', 'ryan', 'sally') person2 <- c('mike', 'sally', 'ryan', 'sam', 'sam', 'mike') stocks <- rnorm(6, 50000, 10000) df1 <- data.frame(year, person1, person2, stocks) #create df2 year <- c(2017, 2017, 2016, 2016, 2015, 2015) person1 <- c('sam', 'sally', 'sally', 'sam', 'ryan', 'mike') person2 <- c('mike', 'sarah', 'ryan', 'kat', 'sam', 'sally') bonds <- rnorm(6, 10000, 1000) df2 <- data.frame(year, person1, person2, bonds) #merge attempt left_join(df1, df2, by = c('year', 'person1')) 中,有时会切换df2person1,因此person2,但名称对组合仍然相同。

有没有办法根据df1$person1 == df1$person2 AND year加入这些dfs?

或者,我考虑根据(df1$person1 == df2$person1 OR df1$person1 == df2$person2)matchup_code列中字符的产品ASCII代码生成新变量person1,然后按person2加入。但是,c('year', 'matchup_code')生成一个向量,我无法弄清楚如何乘法。

1 个答案:

答案 0 :(得分:1)

并行最小值(或最大值) - pmin / pmax - 也适用于字符,因此您可以根据它创建一个新列并将其合并,即

dplyr::left_join(transform(df1, new_person = pmin(person1, person2)), 
                 transform(df2, new_person = pmin(person1, person2)), 
                 by = c('year', 'new_person'))

给出了

  year person1.x person2.x   stocks new_person person1.y person2.y     bonds
1 2017       sam      mike 51482.66       mike       sam      mike  9562.717
2 2017     sarah     sally 49111.11      sally     sally     sarah  9057.971
3 2016     sally      ryan 58437.37       ryan     sally      ryan 11129.295
4 2016       kat       sam 45919.27        kat       sam       kat 10257.276
5 2015      ryan       sam 44734.43       ryan      ryan       sam 10154.195
6 2015     sally      mike 49002.75       mike      mike     sally  9398.425

注意:确保您的变量设置为as.character