Swirl R语言数据操作课程:保留6位小数且不改变列类型
解决Swirl习题中显示6位小数且保留数值类型的问题
我明白你的困扰——用sprintf会把列转成字符型,Swirl不买账,但又需要显示6位小数。这里有几个靠谱的方法,都能保持<double>类型:
方法1:设置全局显示选项(简单直接)
R默认的小数显示位数可能不够,你可以通过设置nsmall选项强制显示至少6位小数,而且不会改变数据类型。在运行head(titanic_4)之前,先执行:
options(nsmall = 6)
之后再打印你的数据框,perc_survived列就会显示完整的6位小数,同时保持数值类型。如果之后想恢复默认,只要运行options(nsmall = NULL)就行。
方法2:计算时保留精度+打印时指定格式
如果不想改动全局设置,可以在计算时先用round()确保数值精度,然后打印时指定小数位数:
第一步:修改你的mutate语句,保留6位小数精度
titanic_4 <- titanic %>% select(Survived, Pclass, Age, Sex) %>% filter(!is.na(Age)) %>% mutate(agecat = cut(Age, breaks = c(0, 14.99, 50, 150), include.lowest = TRUE, labels = c("Under 15", "15 to 50", "Over 50"))) %>% group_by(Pclass,agecat,Sex) %>% summarize(N=n(), survivors = sum(Survived)) %>% mutate(perc_survived = round((survivors/N)*100, 6)) # 用round保留6位小数精度
第二步:打印时指定显示6位小数
用print()函数的nsmall参数强制显示6位小数:
print(head(titanic_4), nsmall = 6)
这样既保证了数值类型,又能让Swirl看到符合要求的6位小数输出。
为什么你的原代码不行?
你在计算时乘100.000000其实没用,因为R的数值计算里,100和100.000000的存储逻辑是一样的,关键是显示设置而非计算时的写法。sprintf会把数值转成字符串,这就是Swirl拒绝的核心原因——它需要的是数值型列而非字符型。
内容的提问来源于stack exchange,提问作者user9237696
相关产品推荐
相关产品推荐

