gpt4 book ai didi

r - inner_join() 其中一个键的值范围(年份)

转载 作者:行者123 更新时间:2023-12-04 10:42:47 27 4
gpt4 key购买 nike

我有两个格式如下的数据集:

df1
#> Artist Album Year
#> 1 Beatles Sgt. Pepper's 1967
#> 2 Rolling Stones Sticky Fingers 1971

df2
#> Album Year Producer
#> 1 Sgt. Pepper's 1966 George Martin
#> 2 Sticky Fingers 1971 Jimmy Miller

我想按专辑和年份进行 inner_join,但有时“年份”字段会偏移一年:例如,Sgt. Peppers 在 df1 中列为 1967,在 df2 中列为 1966。

所以如果我运行:

df3 <- inner_join(df1, df2, by = c("Album", "Year"))

我得到:

df3
#> Artist Album Year Producer
#> 1 Rolling Stones Sticky Fingers 1971 Jimmy Miller

然而,我希望两个专辑都加入,只要像 (df1$Year == df2$Year + 1)|(df1$Year == df2$Year - 1) .

我不能简单地按“专辑”加入,因为在我的真实数据集中,有一些名称相同的“专辑”以“年份”区分。

以下数据集的代码:

df1 <- data.frame(stringsAsFactors=FALSE,
Artist = c("Beatles", "Rolling Stones"),
Album = c("Sgt. Pepper's", "Sticky Fingers"),
Year = c(1967, 1971)
)
df1

df2 <- data.frame(stringsAsFactors=FALSE,
Album = c("Sgt. Pepper's", "Sticky Fingers"),
Year = c(1966, 1971),
Producer = c("George Martin", "Jimmy Miller")
)
df2

最佳答案

我们可以在这里尝试使用 sqldf 包,因为您的要求可以很容易地使用 SQL 连接来表达:

library(sqldf)

sql <- "SELECT t1.Artist, t1.Album, t1.Year, t2.Album, t2.Year, t2.Producer
FROM df1 t1
INNER JOIN df2 t2
ON ABS(t1.Year - t2.Year) <= 1"
df3 <- sqldf(sql)

如果要从两个表中选择所有字段,则使用:

SELECT t1.*, t2.* FROM ...

但请注意,一般来说 SELECT * 是不受欢迎的,最好始终列出要选择的列。

关于r - inner_join() 其中一个键的值范围(年份),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56607188/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com