Data.frame使用其他Data.frame(如Excel)中的条件转换数据;标准表“;

Data.frame使用其他Data.frame(如Excel)中的条件转换数据;标准表“;,r,dataframe,tidyverse,R,Dataframe,Tidyverse,我有data.framedf1和data.framedf2。如何使用df2将df1变异/转换为mergeddata.frame,其中:如果df1$id>=df2$start和df1,则列name将填充df2$name上的值 身份证 11A 2 b 3 c 4d 5 e 6楼 7克 8小时 9我 10 j >df2 名称开始结束 1 A 2 4 2 B 5 7 3 C 8 9 >合并 身份证名称 11A 2 b A 3 c A 每年4天 5 e B 6楼B座 7克体重 8小时 9 i C 10 j

我有data.frame
df1
和data.frame
df2
。如何使用df2将df1变异/转换为
merged
data.frame,其中:如果df1$id>=df2$start和df1,则列
name
将填充
df2$name
上的值 身份证 11A 2 b 3 c 4d 5 e 6楼 7克 8小时 9我 10 j >df2 名称开始结束 1 A 2 4 2 B 5 7 3 C 8 9 >合并 身份证名称 11A 2 b A 3 c A 每年4天 5 e B 6楼B座 7克体重 8小时 9 i C 10 j
我们可以将非等联接与
数据表一起使用,并在满足条件联接的地方,用“name”的相应值分配一个新列

library(data.table)
setDT(df1)[df2, cn := name, on = .(id > start, id <= end)]
df1
#    id c   cn
# 1:  1 a <NA>
# 2:  2 b <NA>
# 3:  3 c    A
# 4:  4 d    A
# 5:  5 e <NA>
# 6:  6 f    B
# 7:  7 g    B
# 8:  8 h <NA>
# 9:  9 i    C
#10: 10 j <NA>

df1$c
应保持不变。
merged
是预期的输出。无论如何,这似乎完成了任务:
mergedt=start,id
> df1
   id c
1   1 a
2   2 b
3   3 c
4   4 d
5   5 e
6   6 f
7   7 g
8   8 h
9   9 i
10 10 j
> df2
  name start end
1    A     2   4
2    B     5   7
3    C     8   9
> merged
   id c name
1   1 a <NA>
2   2 b    A
3   3 c    A
4   4 d    A
5   5 e    B
6   6 f    B
7   7 g    B
8   8 h    C
9   9 i    C
10 10 j <NA>
library(data.table)
setDT(df1)[df2, cn := name, on = .(id > start, id <= end)]
df1
#    id c   cn
# 1:  1 a <NA>
# 2:  2 b <NA>
# 3:  3 c    A
# 4:  4 d    A
# 5:  5 e <NA>
# 6:  6 f    B
# 7:  7 g    B
# 8:  8 h <NA>
# 9:  9 i    C
#10: 10 j <NA>
library(fuzzyjoin)
library(dplyr)
fuzzy_left_join(df1, df2, by = c('id' = 'start', 'id' = 'end'), 
         match_fun = list(`>`, `<=`)) %>%
     select(id, c, cn = name)