格式化data.table列值(行)(如果为数字)

时间:2018-11-02 03:06:41

标签: r data.table

我正在创建摘要data.table,该摘要将使用knitr插入到xtable报告中。我想检查每一列中的每一行值是否为is.numeric() == TRUE,如果是,请格式化数字,然后将其还原为一个字符。如果is.numeric() == FALSE,则返回值。实际的data.table可能有很多列。

这是我下面的内容,底部是所需的输出:

library(data.table)
library(magrittr)

dt <- data.table(A = c("apples",
                       "bananas",
                       1000000.999),
                 B = c("red",
                       5000000.999,
                       0.99))

dt

a <- dt[, lapply(.SD,
                 function(x)  {
                   if (is.na(is.numeric(x))) {
                     prettyNum(as.numeric(x), digits = 0, big.mark = ",")
                   } else {
                     x
                   }
                 })]

a

b <- dt[, A := ifelse(is.na(is.numeric(A)),
                      format(as.numeric(A), digits = 0, big.mark = ","),
                      A)] %>% 
  .[, B := ifelse(is.na(is.numeric(B)),
                  format(as.numeric(B), digits = 0, big.mark = ","),
                  B)]

b
b


desired <- data.table(A = c("apples",
                            "bananas",
                            "1,000,000"),
                      B = c("red",
                            "5,000,000",
                            "1"))

desired

根据我的理解,lapply语法的j参数中的data.table对向量进行操作,因此可以将其用于类似mean()sum()的函数,na.approx()等,不一定在这里工作。但是我想遍历data.table中的每一列而不指定每一列的名称,因为可能会有很多列,并且命名它们会很麻烦。有点像我知道圆圈不在正方形内,但我真的希望它成直线!

我尝试了我认为应该有效的:= ifelse()方法,但是它似乎正在返回第一个元素。在另一列完全为数字的data.table上,采用相同的方法将产生所有NA

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我们可以将setnumber一起使用。用for循环遍历列序列,标识全数字或.('i1')的元素索引,将其用作{{1}中的i },将这些元素转换为set,应用numeric为该元素设置number

format