Advertisement
Guest User

Untitled

a guest
Apr 25th, 2014
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.83 KB | None | 0 0
  1. df1 <- data.frame(states = c("wash", "mont", "oreg", "cali", "michi"), key1 = c(1,3,5,7,9), key2 = c(2,4,6,8,10))
  2.  
  3. states key1 key2
  4. 1 wash 1 2
  5. 2 mont 3 4
  6. 3 oreg 5 6
  7. 4 cali 7 8
  8. 5 michi 9 10
  9.  
  10. df2 <- data.frame(sample = c(9,8,5,4,1), value = c("steel", "gold", "blue", "grey", "green"))
  11.  
  12. sample value
  13. 1 9 steel
  14. 2 8 gold
  15. 3 5 blue
  16. 4 4 grey
  17. 5 1 green
  18.  
  19. states key1 key2 sample value
  20. 1 wash 1 2 1 green
  21. 2 mont 3 4 4 grey
  22. 3 oreg 5 6 5 blue
  23. 4 cali 7 8 8 gold
  24. 5 michi 9 10 9 steel
  25.  
  26. rbind(transform(merge(df1, df2, by.x = "key1", by.y = "sample"), sample = key1),
  27. transform(merge(df1, df2, by.x = "key2", by.y = "sample"), sample = key2))
  28. # key1 states key2 value sample
  29. # 1 1 wash 2 green 1
  30. # 2 5 oreg 6 blue 5
  31. # 3 9 michi 10 steel 9
  32. # 4 3 mont 4 grey 4
  33. # 5 7 cali 8 gold 8
  34.  
  35. match.idx <- pmax(match(df1$key1, df2$sample),
  36. match(df1$key2, df2$sample), na.rm = TRUE)
  37. cbind(df1, df2[match.idx, ])
  38. # states key1 key2 sample value
  39. # 5 wash 1 2 1 green
  40. # 4 mont 3 4 4 grey
  41. # 3 oreg 5 6 5 blue
  42. # 2 cali 7 8 8 gold
  43. # 1 michi 9 10 9 steel
  44.  
  45. require(data.table) ## >= 1.9.0
  46. setDT(df1) ## convert data.frame to data.table by reference
  47. setDT(df2) ## idem
  48.  
  49. # get the key as a common column
  50. df1[(key1 %in% df2$sample), the_key := key1]
  51. df1[(key2 %in% df2$sample), the_key := key2]
  52.  
  53. # setkey and join
  54. setkey(df1, the_key)
  55. setkey(df2, sample)
  56. df1[df2]
  57.  
  58. # states key1 key2 the_key value
  59. # 1: wash 1 2 1 green
  60. # 2: mont 3 4 4 grey
  61. # 3: oreg 5 6 5 blue
  62. # 4: cali 7 8 8 gold
  63. # 5: michi 9 10 9 steel
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement