【问题标题】:reformat multiple variables with data.table in R在 R 中使用 data.table 重新格式化多个变量
【发布时间】:2020-08-18 03:10:15
【问题描述】:

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

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

但是,此代码将所有列转换为 character 向量。如果可能的话,我想将所有变量重新格式化为它们原来的 class 以及 class character 的任何变量为数字(所以在变量是数字但至少有一个观察值的情况下,@ 987654329@ 某处,例如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属于classinteger,同时保留classcharacter属于letters

【问题讨论】:

    标签: r string data.table format numeric


    【解决方案1】:

    如果我们使用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,但由于 - 而被更改时,我们才会这样做

    【讨论】:

    • 感谢您的回答,虽然您的代码确实替换了所有-,但所有列最后仍然属于character
    • @cachdies 这是因为我们没有使用as.numeric 转换为numeric 或只是使用type.convert
    • 简单添加as.numeric()的问题是最后一列被NA填满了,里面的所有信息都丢失了。
    • @cachdies 你检查了我的更新和答案。我没有简单地添加as.numeric。这是在使用 gsub 删除 - 并假设您的列只有 - 作为非数字值之后
    • @cachdies 抱歉,我没有检查您的新示例。我在想所有的列都应该是数字的。我的错.. 使用第一个 type.convert 否则必须在第二个代码中使用 if/else
    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    相关资源
    最近更新 更多