Data.frame使用其他Data.frame(如Excel)中的条件转换数据;标准表“;
我有data.frameData.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
df1
和data.framedf2
。如何使用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)