在 R 中用 data.table 重新格式化多个变量

reformat multiple variables with data.table in R

所以我有一个包含数千个变量的数据 table。数据无论如何都不是很干净,所以我 运行 下面的代码从我的 dt 中删除所有 -- 系列。

dt <- as.data.table(lapply(dt, function(x) {
  gsub("-+", "", x)
}))

然而,此代码 t运行s 将所有列转换为 character 向量。如果可能的话,我想将所有变量重新格式化为它们的原始 class 以及 class character 中的任何变量为数字(因此在变量为数字但具有至少有一个在某处带有 - 的观察结果,例如 123-.

这可以通过 fwrite() 然后 fread() 来完成,但我想避免编写临时文件只是为了将其重新导入到同一会话,因为这会占用存储空间和时间.


示例:

假设您有以下数据:

library(data.table)

dt <- data.table(nums = 11:20,
                 char_nums = c(as.character(1:9), "10-"),
                 letters = letters[1:10])


# nums is of class integer, char_nums is of class character
str(dt)

目标是删除所有 - 系列,并让 numschar_nums 属于 class integer,同时保留 class characterletters

如果我们使用data.table,我们可以遍历Data.table的子集(.SD

library(data.table)
dt1 <- dt[, lapply(.SD, gsub, pattern = '-+', replacement = "")]
dt1 <- type.convert(dt1, as.is = TRUE)

str(dt1)
#Classes ‘data.table’ and 'data.frame': 10 obs. of  3 variables:
#$ nums     : int  11 12 13 14 15 16 17 18 19 20
#$ char_nums: int  1 2 3 4 5 6 7 8 9 10
#$ lett     : chr  "a" "b" "c" "d" ...

或在删除 -

后使用 as.numeric
dt1 <- dt[, lapply(.SD, function(x) as.numeric(gsub("-+", "", x)))]

但是,只有当我们确定所有列通常都是 numeric 类型时,我们才会这样做,但由于 -

而被更改