将多个整数列读取为字符串,尝试 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 <- sapply(df, class)
获取colClasses 的命名向量。您可以使用as.vector()
和names()
分别获取组件。根据需要修复它,将其放入您的代码中,然后使用fread('your.csv', colClasses=myColClasses)
重新读取。相信我,它会让你的生活变得理智。这不需要时间,您可以通过编程方式完成。 (顺便说一句,CSV 列通常具有命名约定,因此您可以从它们的名称中推断出它们的类型,使用 grep
或 grepl
或 gsub()
)
没有“可能”,我已经这样做多年了。只需学习一次,永不回头。
有帮助的: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 并转换回整数的主要内容,如果未能解决你的问题,请参考以下文章
如何将文本列转换为 MS SQL Express 中的整数列?
将 Key 转换为 String 并转换回 Key Java