如何找出哪些值对应于另一个数据框中的范围?

问题描述 投票:0回答:1

我试图找出一个数据帧中的哪些值位于另一个数据帧中的值之间,并基于此将数据获取到列中。

假设我有 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 
r dataframe match
1个回答
1
投票

我们可以进行范围连接,然后用相应的 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)

© www.soinside.com 2019 - 2024. All rights reserved.