我有兩個具有不同行數的資料框,下面的簡單示例:
df= data.frame(Xmin=c(10,15),Xmax=c(20,20),Ymin=c(10,20),Ymax=c(20,25),ID=c(1,2))
df
Xmin Xmax Ymin Ymax ID
1 10 20 10 20 1
2 15 20 20 25 2
df2=data.frame(Xmin=c(13,15,17),Xmax=c(17,17,19),Ymin=c(12,21,20),Ymax=c(18,25,22),ID=c(NA,NA,NA))
df2
Xmin Xmax Ymin Ymax ID
1 13 17 12 18 NA
2 15 17 21 25 NA
3 17 19 20 22 NA
對于匹配條件的行,我想用df2ID 列中的相應值替換列 ID。df
df2$Xmin >= df$Xmin & df2$Xmax<=df$Xmax & df2$Ymin >= df$Ymin & df2$Ymax<=df$Ymax
所需的輸出是
Xmin Xmax Ymin Ymax ID
1 13 17 12 18 1
2 15 17 21 25 2
3 17 19 20 22 2
有沒有一種簡單的方法可以實作這一目標?
uj5u.com熱心網友回復:
另一種可能的解決方案,tidyverse基于 -:
library(tidyverse)
df2 %>%
rowwise() %>%
mutate(ID = df[Xmax <= df$Xmax & Xmin >= df$Xmin & Ymax <= df$Ymax & Ymin >= df$Ymin,"ID"][1]) %>%
ungroup
#> # A tibble: 3 x 5
#> Xmin Xmax Ymin Ymax ID
#> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 13 17 12 18 1
#> 2 15 17 21 25 2
#> 3 17 19 20 22 2
uj5u.com熱心網友回復:
類似的東西ifelse():
df= data.frame(Xmin=c(10,20),Xmax=c(20,20),Ymin=c(10,20),Ymax=c(20,25),ID=c(1,2))
df2=data.frame(Xmin=c(13,15,17),Xmax=c(17,17,19),Ymin=c(12,21,20),Ymax=c(18,25,22),ID=c(NA,NA,NA))
df2$ID = ifelse(df2$Xmin >= df$Xmin & df2$Xmax<=df$Xmax & df2$Ymin >= df$Ymin & df2$Ymax<=df$Ymax, df$ID, NA)
df2
#> Xmin Xmax Ymin Ymax ID
#> 1 13 17 12 18 1
#> 2 15 17 21 25 NA
#> 3 17 19 20 22 NA
由reprex 包于 2022-03-07 創建(v2.0.1)
uj5u.com熱心網友回復:
我們可以在這里使用非 equi 連接
library(data.table)
df2$ID <- NULL
setDT(df2)[df, ID := i.ID,
on = .(Xmin >= Xmin, Xmax <= Xmax, Ymin >= Ymin, Ymax <= Ymax)]
-輸出
> df2
Xmin Xmax Ymin Ymax ID
<num> <num> <num> <num> <num>
1: 13 17 12 18 1
2: 15 17 21 25 2
3: 17 19 20 22 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/439411.html
上一篇:逐行比較兩個資料幀以將特征從一個提取到另一個(提高效率)
下一篇:使用熊貓尋找日常平衡?
