我有一个数据框,其中包含来自列联表的数字对象:
x=sample(c(0,1),100,replace=T)
y=sample(c(0,1),100,replace=T)
my_table=table(x,y)
x.true=sum(my_table[2,])
y.true=sum(my_table[,2])
x.true.y.true=my_table[2,2]
x.true.y.false=my_table[2,1]
x.false.y.true=my_table[1,2]
x.false.y.false=my_table[1,1]
my_df=data.frame(x.true,y.true,
x.true.y.true,x.true.y.false,
x.false.y.true,x.false.y.false)
我想打印小数点/尾随零,但sprintf()无效,因为它将元素转换为字符:
> sprintf('%.3f',my_df)
[1] "43.000" "55.000" "22.000" "21.000" "33.000" "24.000"
将其包装为as.numeric也不起作用,因为它只是再次截断了零!
> as.numeric(sprintf('%.3f',my_df))
[1] 43 55 22 21 33 24
即使format.data.frame()也不起作用!
> format.data.frame(my_df,nsmall=5)
x.true y.true x.true.y.true x.true.y.false x.false.y.true x.false.y.false
1 43 55 22 21 33 24
如何强制由数字对象组成的数据框打印小数点/尾随零?
答案 0 :(得分:1)
首先,sprintf()
将返回一个字符向量,如函数小插图中所述:
C函数sprintf的包装,返回一个包含文本和变量值的格式化组合的字符向量。
第二,您的数据框由数字对象组成,正如您正确指出的那样,因此无法获得小数点。您有两种选择:
as.double()
函数包装数据框中的所有对象,然后使用format.data.frame 选项1 快速又脏乱,可能适用于您的数据:
my_df=data.frame(as.double(x.true),as.double(y.true),
as.double(x.true.y.true),as.double(x.true.y.false),
as.double(x.false.y.true),as.double(x.false.y.false))
format.data.frame(my_df,nsmall=5)
但是,如果您有更多数据,这可能会变得非常乏味。您将不得不多次键入包装功能!
选项2 稍微复杂一点,但是可以扩展。
您可能会怀疑不能在数据帧上使用apply()
,这是正确的。要解决此问题,您必须将其转换为矩阵,应用函数,对其进行转置,将其转换回数据框,对其进行格式化,然后将其名称重新命名:
my_df2=format.data.frame(as.data.frame(t(apply(as.matrix(my_df),1,function(x) as.double(x)))),nsmall=5)
names(my_df2)=names(my_df)
my_df2