簡體   English   中英

使用 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.

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