簡體   English   中英

在匹配另一列中的值之后替換一列中的值

[英]Replacing values in one column after matching values from another column

我的數據看起來像這樣。 我現在想做的是使用第二個表中的匹配值替換“舊ID”值:第一個表是這個,

      Old ID |   Usage 
       211         25          
       211         17          
       211         18         
       202         11          
       202         12          
       194         17          
       202         16          
       194         22          
       194         84          
       198         26         

第二個表具有匹配值

      Old ID |     ID 
       211         abf          
       202         rdg          
       194         ufe         
       198                   

將舊ID中的每個值替換為第二個表中的相應值后,應更改第一個表。 如果ID列中的值丟失或為“ NULL”,則第一個表中的替換值應顯示為“ N / A”。第一個表現在應如下所示,

      Old ID |   Usage 
       abf         25          
       abf         17          
       abf         18         
       rdg         11          
       rdg         12          
       ufe         17          
       rdg         16          
       ufe         22          
       ufe         84          
       n/a         26   

我有大約200萬個這樣的條目。 非常感謝您的幫助

像這樣嗎

df1 <- data.frame(old.id = c(211, 211, 211, 202, 194, 202, 198, 194), usage=c(20:27), stringsAsFactors = F)
df2 <- data.frame(old.id = c(211, 211, 212, 213, 202, 198), ID =  c("a", "a", "b", "c", "d", "e"), stringsAsFactors = F)


df1$old.id <- sapply(df1$old.id , (function(nm) { out <- df2[df2$old.id == nm, ]$ID; ifelse(length(out) > 0, out[1], NA) }))

df1    

首先合並兩個表,然后刪除重復項,如下所示:

  S=merge(df1,df2,by="Old_ID")
  S[!duplicated(S),c(3,2)]
      ID Usage
 1   ufe    17
 4   ufe    22
 7   ufe    84
 10 <NA>    26
 11  rdg    11
 14  rdg    12
 17  rdg    16
 20  abf    25
 23  abf    17
 26  abf    18

這可以通過join更新來解決:

library(data.table)
setDT(DT1)[setDT(DT2), on = "Old_ID", Old_ID := ID][]
  Old_ID Usage 1: abf 25 2: abf 17 3: abf 18 4: rdg 11 5: rdg 12 6: ufe 17 7: rdg 16 8: ufe 22 9: ufe 84 10: NA 26 

數據

DT1 <- structure(list(Old_ID = c("abf", "abf", "abf", "rdg", "rdg", 
"ufe", "rdg", "ufe", "ufe", NA), Usage = c("25", "17", "18", 
"11", "12", "17", "16", "22", "84", "26")), .Names = c("Old_ID", 
"Usage"), row.names = c(NA, -10L), class = c("data.table", "data.frame"))

DT2 <- structure(list(Old_ID = c("211", "202", "194", "198"), ID = c("abf", 
"rdg", "ufe", NA)), .Names = c("Old_ID", "ID"), row.names = c(NA, 
-4L), class = c("data.table", "data.frame"))

暫無
暫無

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

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