将多个整数列读取为字符串,尝试 gsub 并转换回整数

Posted

技术标签:

【中文标题】将多个整数列读取为字符串,尝试 gsub 并转换回整数【英文标题】:Read multiple integer columns as string, trying to gsub and convert back to integer 【发布时间】:2018-04-05 20:25:20 【问题描述】:

我在超过 100 列的数据框中有大约 30 列。我正在读取的文件将其数字存储为字符。换句话说,1300 是 1300,R 认为它是一个字符。

我正在尝试通过将"," 替换为空并将该字段转换为整数来解决该问题。我不想在每个有问题的列上使用gsub。我宁愿将列存储为有问题的向量,然后对所有列执行一个函数或 loop

我尝试过使用lapply,但不确定将什么作为“x”变量。

这是我的函数,下面有错误

ItemStats_2014[intColList] <- lapply(ItemStats_2014[intColList],
    as.integer(gsub(",", "", ItemStats_2014[intColList])) )

[.data.table(ItemStats_2014, intColList) 中的错误:当 i 是 data.table(或字符向量),连接的列必须是 使用 'on=' 参数(参见 ?data.table)或通过键入 x 指定 (即已排序,并且,标记为已排序,请参见 ?setkey)。键控连接可能 由于 x 已排序,因此对非常大的数据具有进一步的速度优势 在内存中。

【问题讨论】:

一开始就不要将整数读入字符串,而是将它们读入整数; fread() 将逗号理解为小数分隔符 未来,就lapply本身而言,您可以在lapply调用中定义函数,如下所示:lapply(ItemStats_2014[intColList], function(x) as.integer(gsub(",", "", x))) 嘿,我给了你正确的编程答案,包括如何以编程方式轻松找到 colClasses,即使在 100 列 dfs 上也是如此。这是可扩展的,并且不会泄漏内存和浪费 CPU,这与不必要地将整数读取为字符串然后进行转换不同。查看 gc() 以了解您在数字字符串上浪费了多少内存。 【参考方案1】:

我正在读取的文件将其数字存储为字符[用逗号作为小数分隔符]

直接以十进制读取这些列,而不是字符串: data.table::fread() 理解小数点分隔符:dec=',' 默认情况下。

您可能需要稍微使用fread(..., colClasses=(...) ) 参数来指定整数列:

myColClasses <- rep('string',100) # for example...
myColClasses[intColList] <- 'integer'
# ...any other colClass fixup as needed...
ItemStats_2014 <- fread('your.csv', colClasses=myColClasses)

这种方法比读取为字符串然后再转换更简单、更快,并且使用的内存要少得多。

【讨论】:

这是一个很好的情报,可能会奏效,我喜欢这个答案,但是有很多列我会花很多时间来整理。 @alexb523: 所以试试fread(..., nrows=100)。然后使用myColClasses &lt;- sapply(df, class) 获取colClasses 的命名向量。您可以使用as.vector()names() 分别获取组件。根据需要修复它,将其放入您的代码中,然后使用fread('your.csv', colClasses=myColClasses) 重新读取。相信我,它会让你的生活变得理智。这不需要时间,您可以通过编程方式完成。 (顺便说一句,CSV 列通常具有命名约定,因此您可以从它们的名称中推断出它们的类型,使用 grepgreplgsub() 没有“可能”,我已经这样做多年了。只需学习一次,永不回头。 有帮助的:Programmatically determine the data types of a data frame's columns 谢谢!我一直在寻找只是叫出列名和类。效果很好。【参考方案2】:

尝试使用dplyr::mutate_at() 选择多个列并对它们应用转换。

ItemStats_2014 <- ItemStats_2014 %>%
    mutate_at(intColList, funs(as.integer(gsub(',', '', .))))

mutate_at 从列表中选择列或使用 dplyr 选择器函数(请参阅?select_helpers)然后将一个或多个函数应用于每一列。 gsub 中的. 指的是mutate_at 传递给它的每个选定列。你可以把它想象成function(x) ...中的x

【讨论】:

以上是关于将多个整数列读取为字符串,尝试 gsub 并转换回整数的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery:将整数列转换为日期间隔并添加到日期列

如何将文本列转换为 MS SQL Express 中的整数列?

Azure表存储查询使用Python-读取整数列

将 Key 转换为 String 并转换回 Key Java

如何使用gsub将包含下划线的部分字符串转换为logstash中的括号

如何将图像转换为 Base64 字符串,并转换回图像,保存到 azure blob