Guest User

Untitled

a guest
Jan 23rd, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.17 KB | None | 0 0
  1. df1 <- data.frame(c1=c("a","b","c","d"),c2=c(1,2,3,4) )
  2. df2 <- data.frame(c1=c("c","d","e","f"),c2=c(3,4,5,6) )
  3. > df1
  4. c1 c2
  5. 1 a 1
  6. 2 b 2
  7. 3 c 3
  8. 4 d 4
  9. > df2
  10. c1 c2
  11. 1 c 3
  12. 2 d 4
  13. 3 e 5
  14. 4 f 6
  15.  
  16. c1 c2
  17. 1 a 1
  18. 2 b 2
  19.  
  20. df1[!duplicated(rbind(df2, df1))[-seq_len(nrow(df2))], ]
  21. # c1 c2
  22. # 1 a 1
  23. # 2 b 2
  24.  
  25. dt1 <- data.table(df1, key="c1")
  26. dt2 <- data.table(df2)
  27. dt1[!dt2]
  28.  
  29. setDT(df1)[!df2, on="c1"]
  30.  
  31. require(sqldf)
  32. sqldf("select * from df1 except select * from df2")
  33.  
  34. ## c1 c2
  35. ## 1 a 1
  36. ## 2 b 2
  37.  
  38. df1 <- data.frame(c1=c("a","b","c","d"),c2=c(1,2,3,4), indf1 = rep("Y",4) )
  39. df2 <- data.frame(c1=c("c","d","e","f"),c2=c(3,4,5,6),indf2 = rep("Y",4) )
  40. merge(df1,df2)
  41. # c1 c2 indf1 indf2
  42. #1 c 3 Y Y
  43. #2 d 4 Y Y
  44.  
  45. bigdf <- merge(df1,df2,all=TRUE)
  46. # c1 c2 indf1 indf2
  47. #1 a 1 Y <NA>
  48. #2 b 2 Y <NA>
  49. #3 c 3 Y Y
  50. #4 d 4 Y Y
  51. #5 e 5 <NA> Y
  52. #6 f 6 <NA> Y
  53.  
  54. bigdf[is.na(bigdf$indf1) ,]
  55. # c1 c2 indf1 indf2
  56. #5 e 5 <NA> Y
  57. #6 f 6 <NA> Y
  58.  
  59. bigdf[is.na(bigdf$indf2) ,] #<- output you requested those not in df2
  60. # c1 c2 indf1 indf2
  61. #1 a 1 Y <NA>
  62. #2 b 2 Y <NA>
  63.  
  64. df1[!(df1$c1 %in% df2$c1), ]
  65.  
  66. na.omit( df1[ sapply( 1:ncol(df1) , function(x) ! df1[,x] %in% df2[,x] ) , ] )
  67. # c1 c2
  68. #1 a 1
  69. #2 b 2
  70.  
  71. setdiff.data.frame <- function(x, y,
  72. by = intersect(names(x), names(y)),
  73. by.x = by, by.y = by) {
  74. stopifnot(
  75. is.data.frame(x),
  76. is.data.frame(y),
  77. length(by.x) == length(by.y))
  78.  
  79. !do.call(paste, c(x[by.x], sep = "30")) %in% do.call(paste, c(y[by.y], sep = "30"))
  80. }
  81.  
  82. # Example usage
  83. # remove all 4 or 6 cylinder 4 gear cars or 8 cylinder 3 gear rows
  84. to_remove <- data.frame(cyl = c(4, 6, 8), gear = c(4, 4, 3))
  85. mtcars[setdiff.data.frame(mtcars, to_remove), ]
  86. #> mpg cyl disp hp drat wt qsec vs am gear carb
  87. #> Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
  88. #> Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
  89. #> Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
  90. #> Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
  91. #> Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
  92. #> Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
  93. #> Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
  94. #> Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
  95.  
  96. # with differing column names
  97. to_remove2 <- data.frame(a = c(4, 6, 8), b = c(4, 4, 3))
  98. mtcars[setdiff.data.frame(mtcars, to_remove2, by.x = c("cyl", "gear"), by.y = c("a", "b")), ]
  99. #> mpg cyl disp hp drat wt qsec vs am gear carb
  100. #> Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
  101. #> Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
  102. #> Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
  103. #> Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
  104. #> Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
  105. #> Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
  106. #> Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
  107. #> Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
Add Comment
Please, Sign In to add comment