Try formatC.
df |> transform(var2=formatC(var2, format='f', digits=2)) |> write.csv(file="test.csv")
Produces a .csv with this content:
"","var1","var2"
"1","A","4.89"
"2","A","6.51"
"3","A","4.91"
"4","A","7.02"
"5","B","4.94"
"6","B","6.30"
"7","B","7.29"
"8","B","3.61"
"9","A","4.72"
"10","B","4.87"
If you don't like the quotes and rownames, use write.csv(..., quote=FALSE, row.names=FALSE)
Note, that xtable::xtable(df) produces LaTeX code on the console and AFAIK has no file= argument.
Here alternatively a generalized data.table approach:
library(data.table)
dt[, (names(.SD)) := lapply(.SD, formatC, format = "f", digits = 2),
.SDcols = sapply(dt, is.numeric)]
fwrite(dt, file='test.csv')
produces:
var1,var2,date
A,4.89,2025-02-24
A,6.51,2025-02-24
A,4.91,2025-02-24
A,7.02,2025-02-24
B,4.94,2025-02-24
B,6.30,2025-02-24
B,7.29,2025-02-24
B,3.61,2025-02-24
A,4.72,2025-02-24
B,4.87,2025-02-24
Data:
> df |> dput()
structure(list(var1 = c("A", "A", "A", "A", "B", "B", "B", "B",
"A", "B"), var2 = c(4.89387548390852, 6.51152199743894, 4.9053409615869,
7.01842371387704, 4.93728590094758, 6.30486965422349, 7.28664539270111,
3.61113929888766, 4.72121123318263, 4.86667866360634)), row.names = c(NA,
-10L), class = "data.frame")
> dput(dt)
structure(list(var1 = c("A", "A", "A", "A", "B", "B", "B", "B",
"A", "B"), var2 = c(4.89387548390852, 6.51152199743894, 4.9053409615869,
7.01842371387704, 4.93728590094758, 6.30486965422349, 7.28664539270111,
3.61113929888766, 4.72121123318263, 4.86667866360634), date = structure(c(20143,
20143, 20143, 20143, 20143, 20143, 20143, 20143, 20143, 20143
), class = "Date")), row.names = c(NA, -10L), class = c("data.table",
"data.frame"))
var2<-signif(rnorm(10, mean=5, sd=1), digits = 2)