簡體   English   中英

根據與其他數據幀最近的鄰居分配值

[英]Assign a value based on closest neighbour from other data frame

使用通用數據:

set.seed(456)

a <- sample(0:1,50,replace = T)
b <- rnorm(50,15,5)
df1 <- data.frame(a,b)

c <- seq(0.01,0.99,0.01)
d <- rep(NA, 99)
for (i in 1:99) {
  d[i] <- 0.5*(10*c[i])^2+5
}
df2 <- data.frame(c,d)

對於每個df1$b我們想要找到最近的df2$d 然后我們創建一個新的變量df1$XYZ ,它取df2$c的最接近的df2$d

這個問題引導我走向data.table庫。 但我不確定是否也可以使用ddplyrgroup_by

這是我的data.table嘗試:

library(data.table)
dt1 <- data.table( df1 , key = "b" )
dt2 <- data.table( df2 , key = "d" )

dt[ ldt , list( d ) , roll = "nearest" ]

這是data.table的一種方式:

require(data.table)
setDT(df1)[, XYZ := setDT(df2)[df1, c, on=c(d="b"), roll="nearest"]]

對於每個df1$b你需要得到與df2$d最接近的值相對應的df2$c 因此,我們需要以df2[df1] ,這會產生nrow(df1)行。可以使用setDT(df2)[df1, c, on=c(d="b"), roll="nearest"]

它返回您需要的結果。 我們需要做的就是將其添加回名為XYZ df1 我們這樣做:=


構建滾動連接的思維過程是這樣的(假設df1df2都是數據表):

  1. 我們需要為df1每一行獲取一些值。 這意味着,在x[i]語法中i = df1

     df2[df1] 
  2. 我們需要將df2$d加入df1$b 使用on=那是:

     df2[df1, on=c(d="b")] 
  3. 我們只需要c列。 使用j僅選擇該列。

     df2[df1, c, on=c(d="b")] 
  4. 我們不需要等連接,而是滾動到最近的連接。

     df2[df1, c, on=c(d="b"), roll="nearest"] 

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM