简体   繁体   English

如何控制 write.table() 输出中的小数位数?

[英]How to control number of decimal digits in write.table() output?

When working with data (eg, in data.frame) the user can control displaying digits by using在处理数据时(例如,在 data.frame 中),用户可以通过使用来控制显示数字

options(digits=3) 

and listing the data.frame like this.并像这样列出 data.frame。

ttf.all

When the user needs to paste the data in Excell like this当用户需要像这样在Excel中粘贴数据时

write.table(ttf.all, 'clipboard', sep='\t',row.names=F)

The digits parameter is ignored and numbers are not rounded. digits 参数被忽略,数字不四舍五入。

See nice output看到不错的输出

> ttf.all
  year V1.x.x V1.y.x ratio1 V1.x.y V1.y.y ratioR V1.x.x V1.y.x ratioAL V1.x.y V1.y.y ratioRL
1 2006    227    645   35.2     67    645   10.4    150    645    23.3     53    645    8.22
2 2007    639   1645   38.8    292   1645   17.8    384   1645    23.3    137   1645    8.33
3 2008   1531   3150   48.6    982   3150   31.2    755   3150    24.0    235   3150    7.46
4 2009   1625   3467   46.9   1026   3467   29.6    779   3467    22.5    222   3467    6.40

But what is in excel (clipboard) is not rounded.但是 excel(剪贴板)中的内容不是四舍五入的。 How to control in in write.table() ?如何控制 in write.table()

You can use the function format() as in:您可以使用函数format() ,如下所示:

write.table(format(ttf.all, digits=2), 'clipboard', sep='\t',row.names=F)

format() is a generic function that has methods for many classes, including data.frames. format()是一个通用函数,它具有许多类的方法,包括 data.frames。 Unlike round() , it won't throw an error if your dataframe is not all numeric.round()不同,如果您的数据框不是全数字的,它不会抛出错误。 For more details on the formatting options, see the help file via ?format有关格式化选项的更多详细信息,请通过?format查看帮助文件

Adding a solution for data frame having mixed character and numeric columns.为具有混合characternumeric列的数据框添加解决方案。 We first use mutate_if to select numeric columns then apply the round() function to them.我们首先使用mutate_if选择numeric列,然后对它们应用round()函数。

# install.packages('dplyr', dependencies = TRUE)
library(dplyr)

df <- read.table(text = "id  year V1.x.x V1.y.x ratio1
a 2006    227.11111    645.11111   35.22222  
b 2007    639.11111   1645.11111   38.22222  
c 2008   1531.11111   3150.11111   48.22222  
d 2009   1625.11111   3467.11111   46.22222",
                 header = TRUE, stringsAsFactors = FALSE)

df %>% 
  mutate_if(is.numeric, round, digits = 2)
#>   id year  V1.x.x  V1.y.x ratio1
#> 1  a 2006  227.11  645.11  35.22
#> 2  b 2007  639.11 1645.11  38.22
#> 3  c 2008 1531.11 3150.11  48.22
#> 4  d 2009 1625.11 3467.11  46.22

### dplyr v1.0.0+
df %>% 
  mutate(across(where(is.numeric), ~ round(., digits = 2)))
#>   id year  V1.x.x  V1.y.x ratio1
#> 1  a 2006  227.11  645.11  35.22
#> 2  b 2007  639.11 1645.11  38.22
#> 3  c 2008 1531.11 3150.11  48.22
#> 4  d 2009 1625.11 3467.11  46.22

Created on 2019-03-17 by the reprex package (v0.2.1.9000)reprex 包(v0.2.1.9000) 创建于 2019-03-17

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM