我想加入两个数据框(df1
和df2
),具体取决于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'))
中,有时会切换df2
和person1
,因此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')
生成一个向量,我无法弄清楚如何乘法。
答案 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