Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R: finding intersection between two vectors [duplicate]

Tags:

r

vector

v1 = c(2, 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 
  2.11, 2.12, 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 
  2.22, 2.23, 2.24, 2.25, 2.26, 2.27, 2.28, 2.29, 2.3, 2.31, 2.32, 
  2.33, 2.34, 2.35, 2.36, 2.37, 2.38, 2.39, 2.4, 2.41, 2.42, 2.43, 
  2.44, 2.45, 2.46, 2.47, 2.48, 2.49, 2.5, 2.51, 2.52, 2.53, 2.54, 
  2.55, 2.56, 2.57, 2.58, 2.59, 2.6, 2.61, 2.62, 2.63, 2.64, 2.65, 
  2.66, 2.67, 2.68, 2.69, 2.7, 2.71, 2.72, 2.73, 2.74, 2.75, 2.76, 
  2.77, 2.78, 2.79, 2.8, 2.81, 2.82, 2.83, 2.84, 2.85, 2.86, 2.87, 
  2.88, 2.89, 2.9, 2.91, 2.92, 2.93, 2.94, 2.95, 2.96, 2.97, 2.98, 
  2.99)

> intersect(v1, seq(2, 2.99, 0.01))
 [1] 2.00 2.01 2.02 2.04 2.05 2.06 2.08 2.09 2.10 2.12 2.13 2.14 2.16 2.17 2.19 2.20 2.21 2.23 2.24 2.25 2.26 2.27
[23] 2.28 2.29 2.30 2.31 2.33 2.34 2.35 2.37 2.38 2.39 2.41 2.42 2.44 2.45 2.46 2.48 2.49 2.50 2.51 2.52 2.53 2.54
[45] 2.55 2.56 2.57 2.58 2.59 2.60 2.62 2.63 2.64 2.66 2.67 2.69 2.70 2.71 2.72 2.73 2.74 2.75 2.76 2.77 2.78 2.79
[67] 2.80 2.81 2.82 2.83 2.84 2.85 2.87 2.88 2.89 2.91 2.92 2.94 2.95 2.96 2.97 2.98 2.99

I have a vector of length 100 called v1. I want to see the intersection of v1 and a seq(2, 2.99, 0.01) vector (should be just v1 itself). But I get a vector that is only 83 elements long? And clearly 2.03, 2.15 ... are not in the intersection. How is that possible?

like image 423
Adrian Avatar asked Jul 24 '17 01:07

Adrian


1 Answers

This a floating point error in r. See the Floating Point Guide for more information.

This can be seen as the error because this returns what you're looking for:

v1 = c(2, 2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 
  2.11, 2.12, 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 
  2.22, 2.23, 2.24, 2.25, 2.26, 2.27, 2.28, 2.29, 2.3, 2.31, 2.32, 
  2.33, 2.34, 2.35, 2.36, 2.37, 2.38, 2.39, 2.4, 2.41, 2.42, 2.43, 
  2.44, 2.45, 2.46, 2.47, 2.48, 2.49, 2.5, 2.51, 2.52, 2.53, 2.54, 
  2.55, 2.56, 2.57, 2.58, 2.59, 2.6, 2.61, 2.62, 2.63, 2.64, 2.65, 
  2.66, 2.67, 2.68, 2.69, 2.7, 2.71, 2.72, 2.73, 2.74, 2.75, 2.76, 
  2.77, 2.78, 2.79, 2.8, 2.81, 2.82, 2.83, 2.84, 2.85, 2.86, 2.87, 
  2.88, 2.89, 2.9, 2.91, 2.92, 2.93, 2.94, 2.95, 2.96, 2.97, 2.98, 
  2.99)

v2 <- seq(2, 2.99, 0.01)

v1 <- round(v1,2) #rounds to 2 decimal places
v2 <- round(v2,2)

intersect(v1,v2) #returns v1
like image 51
Tiffany Avatar answered Oct 17 '22 05:10

Tiffany