我正在创建摘要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
。
感谢您的帮助!
答案 0 :(得分:1)
我们可以将set
与number
一起使用。用for
循环遍历列序列,标识全数字或.
('i1')的元素索引,将其用作{{1}中的i
},将这些元素转换为set
,应用numeric
为该元素设置number
format