I am trying to translate some SAS code into R. I am using SAS Viya on a remote server and the latest version of R on a Windows 10 laptop. Apparently the round function does not work the same in SAS and R. If I divide two vectors and use the round function on the result, SAS and R frequently differ by one. I have been able to get SAS to return the same results as R by using the SAS function rounde instead of round. But I have not been able to figure out how to get R to return the same results as SAS. I guess rounde in SAS 'rounds to even':
Is there a relatively simple way to get base R to return the same results as the round function in SAS? Or would doing so require a complex function? Or is the problem at a deeper level perhaps as described here:
Perhaps the best thing to do is simply define the rounded results in R to be the same as those returned by the round function in SAS until I have the SAS code fully translated?
Here are the vectors, formatted for R, that I have been using:
hr <- c(0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4)
cy <- c(990, 1011, 1036, 1085, 1117, 1157, 1203, 997, 1019, 1045, 1096, 1130, 1171, 1220, 1004, 1027, 1055, 1106, 1143, 1187, 1237)
Here are the lines of code in SAS and R.
In R:
Rpop <- round(cy/hr)
In SAS this is different from R:
SASpop=round(cy/hr);
In SAS this is the same as R:
SASpope=rounde(cy/hr);
Here are the results, formatted in R, from the three lines of code above:
Rpop.results <- c(2475, 2528, 2590, 2712, 2792, 2892, 3008, 2492, 2548, 2612, 2740, 2825, 2928, 3050, 2510, 2568, 2638, 2765, 2858, 2968, 3092)
SASpop.results <- c(2475, 2528, 2590, 2713, 2793, 2893, 3008, 2493, 2548, 2613, 2740, 2825, 2928, 3050, 2510, 2568, 2638, 2765, 2858, 2968, 3093)
SASpope.results <- c(2475, 2528, 2590, 2712, 2792, 2892, 3008, 2492, 2548, 2612, 2740, 2825, 2928, 3050, 2510, 2568, 2638, 2765, 2858, 2968, 3092)
SASpop.results - Rpop
#[1] 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1
SASpope.results - Rpop
#[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Here is functional SAS code:
data a;
input cy hr ;
cards;
990 0.4
1011 0.4
1036 0.4
1085 0.4
1117 0.4
1157 0.4
1203 0.4
997 0.4
1019 0.4
1045 0.4
1096 0.4
1130 0.4
1171 0.4
1220 0.4
1004 0.4
1027 0.4
1055 0.4
1106 0.4
1143 0.4
1187 0.4
1237 0.4
;
data b;
set a;
SASpop=round(cy/hr);
SASpope=rounde(cy/hr);
SASdiff = SASpop - SASpope ;
proc print;
run;
# Obs cy hr SASpop SASpope SASdiff
# 1 990 0.4 2475 2475 0
# 2 1011 0.4 2528 2528 0
# 3 1036 0.4 2590 2590 0
# 4 1085 0.4 2713 2712 1
# 5 1117 0.4 2793 2792 1
# 6 1157 0.4 2893 2892 1
# 7 1203 0.4 3008 3008 0
# 8 997 0.4 2493 2492 1
# 9 1019 0.4 2548 2548 0
# 10 1045 0.4 2613 2612 1
# 11 1096 0.4 2740 2740 0
# 12 1130 0.4 2825 2825 0
# 13 1171 0.4 2928 2928 0
# 14 1220 0.4 3050 3050 0
# 15 1004 0.4 2510 2510 0
# 16 1027 0.4 2568 2568 0
# 17 1055 0.4 2638 2638 0
# 18 1106 0.4 2765 2765 0
# 19 1143 0.4 2858 2858 0
# 20 1187 0.4 2968 2968 0
# 21 1237 0.4 3093 3092 1