我试图找出一个数据帧中的哪些值位于另一个数据帧中的值之间,并基于此将数据获取到列中。
假设我有 2 个数据框,第一个是:
姓名 | 代码 | 活动 |
---|---|---|
苹果 | 02050 | |
三星 | 54004 | |
克鲁格 | 06001 |
第二个df:
活动 | 左 | 右 |
---|---|---|
手机 | 01100 | 01700 |
电脑 | 02000 | 03000 |
汽车 | 03000 | 04000 |
电视 | 05000 | 10000 |
所需输出:
姓名 | 代码 | 活动 |
---|---|---|
苹果 | 02050 | 电脑 |
三星 | 54004 | |
克鲁格 | 06001 | 电视 |
df1 <- data.frame(Name = c("Apple","Samsung", "Kruger"),
Code = c("02050","54004", "06001"),
Activity = "")
df2 <- data.frame(Activity = c("Mobile","computers", "cars", "tv"),
Left = c("01100","02000", "03000", "05000"),
Right = c("01700","03000", "04000", "10000"))
我一整天都被这个问题困扰了。我主要尝试使用 sqldf、left_join 和 which 并不断收到错误。无法理解为什么 which() 不能通过简单地执行以下操作来工作:
df1[which(as.numeric(df1$code) < as.numeric(df2$RIGHT) &
(as.numeric(df1$code) > as.numeric(df2$LEFT) |
as.numeric(df1$code) == as.numeric(df2$LEFT)
)
),]...........etc
我们可以进行范围连接,然后用相应的 Activity 替换空字符串:
library(dplyr)
left_join(df1, df2, by = join_by(between(Code, Left, Right)),
suffix = c("", ".y")) %>%
mutate(Activity = if_else((is.na(Activity) | !nzchar(Activity)) & !is.na(Activity.y),
Activity.y, Activity)) %>%
select(-Activity.y, -Left, -Right)
# Name Code Activity
# 1 Apple 02050 computers
# 2 Samsung 54004
# 3 Kruger 06001 tv
if_else
是必要的(代替coalesce
),因为原来的Activity
是空字符串;如果有 NA
值,我们可以使用 coalesce(Activity, Activity.y)
。