将函数应用于具有数字对象的数据框并打印小数点/尾随零

时间:2019-05-03 16:01:33

标签: r

我有一个数据框,其中包含来自列联表的数字对象:

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

如何强制由数字对象组成的数据框打印小数点/尾随零?

1 个答案:

答案 0 :(得分:1)

首先sprintf()将返回一个字符向量,如函数小插图中所述:

  

C函数sprintf的包装,返回一个包含文本和变量值的格式化组合的字符向量。

第二,您的数据框由数字对象组成,正如您正确指出的那样,因此无法获得小数点。您有两种选择:

  1. 使用as.double()函数包装数据框中的所有对象,然后使用format.data.frame
  2. 将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