我有兩個資料框架DF1和DF2,我需要將DF1的天數與DF2的低范圍和高范圍列進行比較,并在結果資料框架中得到天數范圍列。
Items=c("Vegetable", "水果", "雜貨"。 "Dairy Product")
天數=c(16。 5,41, 25)
DF1=data.frame(Items,Days)
Low_Range=c(0。 8。 15, 22, 31,61)
Hi_Range=c(7。 14。 21, 30。 60,90)
Days_Range=c("7天內"。 "8到14天"。 "15至21天","22至30天"。 "31至60天","61至90天")
DF2=data.frame(Low_Range,Hi_Range,Days_Range)
Days_Slot=c("15 to 21 days"。 "7天內","31至60天"。 "22至30天")
DF_Result=data.frame(Items,Days,Days_Slot)
DF_Result將是我的結果資料框架,Days_Slot是添加到DF1的新列。 誰能幫助解決這個問題呢
uj5u.com熱心網友回復:
這可以通過在一個非等價連接中更新來解決:
library(data.table)
setDT(DF1)[setDT(DF2)。 對=. (Days >= Low_Range, Days < = Hi_Range),
Days_Slot := Days_Range][/span>]
Items Days Days_Slot
1:蔬菜 16 15至21天
2:水果5內7日
3: 雜貨 41 31至60 天
4:乳制品 25 22 to 30天
注意,DF1被更新通過參考,即新列Days_Slot被附加到DF1,而沒有復制物件。
由于區間是連續的,匹配的
Days_Range也可以通過一個滾動連接來確定:
library(data.table)
setDT(DF1)
setDT(DF2)
DF1[, Days_Slot : = DF2[DF1, on = . (Low_Range = Days)。 卷= TRUE]$ operator">$Days_Range][/span>]
Items Days Days_Slot
1:蔬菜 16 15至21天
2:水果5內7日
3: 雜貨 41 31至60 天
4:乳制品 25 22 to 30天
同樣,一個新的列Days_Slot被附加到DF1 通過參考。
順便說一下,一個向后滾動連接將得到同樣的結果:
DF1[, Days_Slot : = DF2[DF1, on = . (Hi_Range = Days)。 卷= -Inf]$Days_Range][/span>]
uj5u.com熱心網友回復:
你可以使用fuzzyjoin。
fuzzyjoin:: fuzzy_left_join(DF1, DF2,
由= c('Days' = 'Low_Range'。 'Days' = 'Hi_Range'),
match_fun = c(/span>`> =`, `<=`))
# Items Days Low_Range Hi_Range Days_Range
#1 蔬菜 16 15 21 15至21天。
#2 水果 5 0 7 7天內 #2水果
#3 雜貨 41 31 60 31至60天
#4 乳制品 25 22 30 22至30天
如果你的資料集很大,你也可以嘗試data.table。
library(data.table)
setDT(DF1)
setDT(DF2)
DF2[DF1, on = . (Low_Range <= Days, Hi_Range > = Days)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/306857.html
標籤:
上一篇:需要幫助將整數轉換為時間
