2016-08-22 9 views
0

Mein Ziel ist es, Elemente in zwei Vektoren zu vergleichen.ifelse | Mismatch

Hier ist mein erster Tibble:

Post_Rev 
# A tibble: 12 x 2 
    Fiscal.Quarter.ID  Rev 
     <S3: yearqtr>  <dbl> 
1   2014 Q1 3889692022 
2   2014 Q2 3763028239 
3   2014 Q3 4092263526 
4   2014 Q4 4865950809 
5   2015 Q1 4015879019 
6   2015 Q2 4112382310 
7   2015 Q3 4247783642 
8   2015 Q4 5040074056 
9   2016 Q1 4100946981 
10   2016 Q2 4021051564 
11   2016 Q3 4373665674 
12   2016 Q4 5064779447 

Hier ist mein zweiter Vektor:

Total_Rev 
[1] 3889692022 3763028239 4092263526 4865950809 4015879019 4112382310 4247783642 5040074056 
[9] 4100946981 4021051564 4373665674 5064779447 

Als wir die beiden Vektoren d Rev in Post_Rev und Total_Rev sehen können, sind gleich. Ich werde Ihnen auch den Klassentyp zeigen.

class(Post_Rev$Rev) 
[1] "numeric" 

class(Total_Rev) 
[1] "numeric" 

Allerdings, wenn ich ifelse laufen, wirft es "ungleichen Reihen" für einige Zeilen:

ifelse(Post_Rev$Rev != Total_Rev,TRUE,FALSE) 
[1] FALSE **TRUE** FALSE FALSE FALSE FALSE FALSE FALSE **TRUE TRUE** FALSE FALSE 

Was könnte der Grund sein? Kann ich überhaupt etwas über den Grund herausfinden? Ich würde deine Gedanken schätzen.

Ich versuchte if_else Funktion Wickham:

if_else(Post_Rev$Rev != Total_Rev,TRUE,FALSE) 
[1] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE 

ich das gleiche Ergebnis bekam. Ich bin mir nicht sicher, warum das passiert.


Hinzufügen dput():

dput(Post_Rev) 
structure(list(Fiscal.Quarter.ID = structure(c(2014, 2014.25, 
2014.5, 2014.75, 2015, 2015.25, 2015.5, 2015.75, 2016, 2016.25, 
2016.5, 2016.75), class = "yearqtr"), Rev = c(3889692022.46776, 
3763028239.33219, 4092263526.07502, 4865950809.37372, 4015879019.37871, 
4112382310.2044, 4247783641.70853, 5040074055.98503, 4100946980.66123, 
4021051564.10049, 4373665674.01029, 5064779446.86354)), .Names = c("Fiscal.Quarter.ID", 
"Rev"), row.names = c(NA, -12L), class = c("tbl_df", "tbl", "data.frame" 
)) 

dput(Total_Rev) 
c(3889692022.46776, 3763028239.33219, 4092263526.07502, 4865950809.37372, 
4015879019.37871, 4112382310.2044, 4247783641.70853, 5040074055.98503, 
4100946980.66123, 4021051564.10049, 4373665674.01029, 5064779446.86354 
+1

"Wie wir sehen können, sind die beiden Vektoren, d. H. Rev in Post_Rev und Total_Rev gleich." Die erste Regel, Zahlen mit Computern zu vergleichen, besteht darin, nicht das zu verwechseln, was auf dem Bildschirm mit dem _wert angezeigt wird. Überprüfen Sie die, die "ifelse" sagt, nicht gleich "all.equal()". – joran

+1

(auch "ifelse" ist überflüssig, da '==' und '! =' Bereits vektorisiert sind) – joran

+0

Joran, Vielen Dank für Ihre Hilfe. Wenn ich all.equal (Post_Rev $ Rev, Total_Rev) ausgeführt habe, habe ich "[1] TRUE" erhalten, was bedeutet, dass die Arrays gleich sind. Könnten Sie bitte erklären, warum Ifelse nicht gesagt hat, dass die Zahlen im obigen Fall gleich sind? Ich bin neugierig. Ich bin ein Anfänger und habe vor kurzem begonnen, in R zu programmieren. Also, ich würde deine Gedanken schätzen. – watchtower

Antwort

0

Ich dachte, diese Frage zu beantworten. r2evans und 42 sind genau richtig:

Wenn wir die Zahlen subtrahieren, sehen wir, dass es einen Unterschied in den Zahlen gibt.

Post_Rev$Rev-Total_Rev 
[1] 0.000000e+00 -4.768372e-07 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
[7] 0.000000e+00 0.000000e+00 -4.768372e-07 -4.768372e-07 0.000000e+00 0.000000e+00