简体   繁体   中英

Controlling number of decimal places in write.table while maintaining class “numeric”

Generally speaking, controlling the number of digits to display when calling write.table is straightforward. Given the excellent question and answer seen here , we see that format is the means to accomplish this feat. However, this creates a file that when viewed by a text editor, shows quotes around numeric values. This can be turned off by setting quote = FALSE in write.table . Unfortunately, this has the side effect of not putting quotations around character columns. Observe:

Normal Case (without format and standard output behavior)

df <- data.frame(c1 = 1:5/100, c2 = LETTERS[1:5])
write.table(df, file = "test.txt", sep = "|")

## when you open test.txt in a text editor, the middle column correctly 
## appears as a numeric (i.e. no quotes), however there are only 2 decimals displayed.
## It should also be noted that the quotes are present in c2 (this is what we want).
    "c1"|"c2"
"1"|0.01|"A"
"2"|0.02|"B"
"3"|0.03|"C"
"4"|0.04|"D"
"5"|0.05|"E"

With Format

df$c1 <- format(df$c1, digits = 4, nsmall = 4)
write.table(df, file = "test.txt", sep = "|")

## when you open test.txt in a text editor, the middle column correctly 
## displays four decimal places, however it now appears to be a character
## (i.e. with quotes). Again, it should be noted that the quotes are 
## present in c2 (again, this is what we want).
     "c1"   |"c2"
"1"|"0.0100"|"A"
"2"|"0.0200"|"B"
"3"|"0.0300"|"C"
"4"|"0.0400"|"D"
"5"|"0.0500"|"E"

With Quotes=FALSE

write.table(df, file = "test.txt", sep = "|", quote = FALSE)

## when you open test.txt in a text editor, the middle column correctly 
## displays four decimal places with no quotes. However the quotes on column
## c2 (and everywhere else) have been dropped (this is NOT what we want).
    c1  |c2
1|0.0100|A
2|0.0200|B
3|0.0300|C
4|0.0400|D
5|0.0500|E

Question

Is there a way to write a data frame to a file that controls the number of decimal places while maintaining the standard instructions of write.table for displaying quotes (ie no quotes around numeric fields and quotes around character fields)? Here is my desired output:

     "c1" |"c2"
"1"|0.0100|"A"
"2"|0.0200|"B"
"3"|0.0300|"C"
"4"|0.0400|"D"
"5"|0.0500|"E"

The quote argument in write.table supports numeric vectors to specify the location of the columns to add quotes, so

write.table(df, file = "test.txt", sep = "|", quote = 2)

works for this example, producing

"c1"|"c2"
"1"|0.01|"A"
"2"|0.02|"B"
"3"|0.03|"C"
"4"|0.04|"D"
"5"|0.05|"E"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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