Я не понимаю этого поведения:
> a = c(1,1,1,1,1)
> (a==1)
[1] TRUE TRUE TRUE TRUE TRUE
> df = data.frame(a=c(1,2,3,4,5), b=c(6,7,8,9,10))
> df
a b
1 1 6
2 2 7
3 3 8
4 4 9
5 5 10
> colSums(df)
a b
15 40
> ndf = apply(df, 2, function(col){col/sum(col)})
> colSums(ndf)
a b
1 1
> (colSums(ndf) == 1)
a b
TRUE FALSE
> typeof(a)
[1] "double"
> class(a)
[1] "numeric"
> typeof(colSums(ndf))
[1] "double"
> class(colSums(ndf))
[1] "numeric"
> b = c(1,1,1,2,1)
> all(b==1)
[1] FALSE
> (b==1)
[1] TRUE TRUE TRUE FALSE TRUE
> all(a==1)
[1] TRUE
> all(colSums(ndf)==1)
[1] FALSE
Почему тот же тест, который «работает» на a
, а b
НЕ работает на colSums(ndf)
?
Хотя я все равно не могу воспроизвести вашу проблему в этом случае. (colSums(ndf) == 1)
дает мне два TRUE
на 64-битной Win7, R 3.4.2.
Невозможно воспроизвести на MacOS, R 3.4.0; all(colSums(ndf)==1)
возвращает TRUE
.
@thelatemail - именно это и происходит. Ага. (abs(colSums(ndf)-1) < 1e-10)
дает TRUE TRUE
. Если вы дадите ответ, я могу согласиться.
это, скорее всего, числовая проблема, вы пробовали
sprintf("%.10f",colSums(ndf))
?