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

时间:2018-04-05 20:25:21

标签: r file-io gsub fread number-formatting

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

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

我尝试过使用lapply,但我不确定该放置什么作为" x"变量

这是我的函数,其下方有错误

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

[.data.table中的错误(ItemStats_2014,intColList):当我是a时   data.table(或字符向量),要连接的列必须是   使用&#39; on =&#39;指定参数(参见?data.table)或键入x   (即排序,并标记为已排序,请参阅?setkey)。键控连接可能   由于x被分类,因此对非常大的数据具有进一步的速度优势   在RAM中。

2 个答案:

答案 0 :(得分:3)

  

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

直接以十进制形式直接读取这些列,而不是字符串: 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)

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

答案 1 :(得分:1)

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

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

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