【发布时间】:2019-09-21 09:41:15
【问题描述】:
我有两个数据框,df1 和 df2,它们采用这样的格式(最后数据输入的可重现代码):
df1
#> name instrument
#> 1 John Lennon guitar
#> 2 Mick Jagger vocals
#> 3 Ringo Starr drums
#> 4 Keith Richards guitar
和
df2
#> name beatles
#> 1 John Lennon 1
#> 2 Ringo Starr 1
#> 3 George Harrison 1
#> 4 Paul McCartney 1
我想在 df1 中添加一列,指示一条记录是否也在 df2 中(如果不是,则等于 0),所以我想要的输出是:
output
#> name instrument beatles
#> 1 John Lennon guitar 1
#> 2 Mick Jagger vocals 0
#> 3 Ringo Starr drums 1
#> 4 Keith Richards guitar 0
我已经尝试过full_join(),但这会拉动 df2 中不在 df1 中的行,这不是我想要的。 (即 George Harrison 和 Paul McCartney 行不应出现在输出中)
library(tidyverse)
df1 %>%
full_join(df2)
#> Joining, by = "name"
#> name instrument beatles
#> 1 John Lennon guitar 1
#> 2 Mick Jagger vocals NA
#> 3 Ringo Starr drums 1
#> 4 Keith Richards guitar NA
#> 5 George Harrison <NA> 1
#> 6 Paul McCartney <NA> 1
下面的可重现代码:
df1 <- data.frame(stringsAsFactors=FALSE,
name = c("John Lennon", "Mick Jagger", "Ringo Starr", "Keith Richards"),
instrument = c("guitar", "vocals", "drums", "guitar")
)
df2 <- data.frame(stringsAsFactors=FALSE,
name = c("John Lennon", "Ringo Starr", "George Harrison",
"Paul McCartney"),
beatles = c(1, 1, 1, 1)
)
library(tidyverse)
df1 %>%
full_join(df2)
【问题讨论】:
-
你想要的是
left_join,但它会给你NA。我不认为你可以只使用join函数一步获得0(我很高兴错了)。