![](/img/trans.png)
[英]Assigning values in dataframe based on matching columns between 2 different dataframe (R)
[英]Mapping and assigning values between columns of different lengths using R
我有一個像這樣的df
structure(list(id = c(4375, 4375, 4375, 4375), time = c(0, 88,
96, 114)), class = "data.frame", row.names = c(NA, -4L))
和第二個 df (df2) 像這樣
structure(list(id2 = c(4375, 4375, 4375, 4375, 4375, 4375, 4375,
4375, 4375, 4375), time2 = c(0, 2, 87, 88, 94, 97, 101, 104,
109, 114), score2 = c(0.028, 0.057, 0.057, 0.057, 0.057, 0.057,
0.057, 0.085, 0.085, 0.085)), class = "data.frame", row.names = c(NA,
-10L))
當df1中的時間值等於或小於df2中的時間時,我希望對於每個id,map df中的時間列和在df1中創建一個分數列並從df2分配分數值。 我希望最終的 df 看起來像這樣
structure(list(id3 = c(4375, 4375, 4375, 4375), time3 = c(0,
88, 96, 116), score3 = c(0.028, 0.057, 0.057, 0.085)), class = "data.frame", row.names = c(NA,
-4L))
對於 id 和 time 列中的完全匹配,我們可以使用left_join
:
library(dplyr)
left_join(df, df2, by=c('id'='id2', 'time'='time2'))
id time score2
1 4375 0 0.028
2 4375 88 0.057
3 4375 96 NA
4 4375 114 0.085
但是,正如我們所見,這不能很好地處理近場比賽。 請定義,“當 df1 中的時間值等於或小於 df2 中的時間時”是什么意思。 等於或小於什么? 我們如何匹配“等於或小於”比較的元素?
library(fuzzyjoin)
fuzzy_left_join(df, df2, by = c("time"="time2"), match_fun = list(`<=`)) %>%
group_by(time2) %>%
slice(n()) %>%
ungroup() %>%
group_by(time) %>%
filter(row_number()==1) %>%
select(id3=id, time3=time, score3 = score2)
id3 time3 score3
<dbl> <dbl> <dbl>
1 4375 0 0.028
2 4375 88 0.057
3 4375 96 0.057
4 4375 114 0.085
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.