Ошибки округления с плавающей запятой. 0,1 не могут быть представлены точно в базе-2, как в базе-10, из-за недостающего простого коэффициента 5. Так же, как 1/3 принимает бесконечное число цифр для представления в десятичной форме, но составляет «0,1» в базе-3, 0.1 принимает бесконечное число цифр в базе-2, где оно не находится в базе-10. И компьютеры не имеют бесконечного объема памяти.
Преобразования, указанные вами в summarize
, выполняются в том порядке, в котором они отображаются, что означает, что если вы изменяете значения переменных, то эти новые значения появляются для последующих столбцов (это отличается от базовой функции tranform()
). Когда вы выполняете
df %>% group_by(time) %>%
summarise(glucose=mean(glucose, na.rm=TRUE),
glucose.sd=sd(glucose, na.rm=TRUE),
n=sum(!is.na(glucose)))
, часть glucose=mean(glucose, na.rm=TRUE)
изменила значение переменной glucose
таким образом, что при вычислении части glucose.sd=sd(glucose, na.rm=TRUE)
в sd()
не отображаются исходные значения глюкозы , он видит новое значение, которое является средним значением исходных значений. Если вы переупорядочиваете столбцы, это будет работать.
df %>% group_by(time) %>%
summarise(glucose.sd=sd(glucose, na.rm=TRUE),
n=sum(!is.na(glucose)),
glucose=mean(glucose, na.rm=TRUE))
Если вам интересно, почему это поведение по умолчанию, это связано с тем, что часто бывает полезно создать столбец, а затем использовать значение столбца позже в преобразованиях. Например, с mutate()
df %>% group_by(time) %>%
mutate(glucose_sq = glucose^2,
glucose_sq_plus2 = glucose_sq+2)