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

14 浏览
0 Comments

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

我在一个包含超过100个列的数据帧中有约30个列。我需要读取的文件将数字存储为字符。换句话说,1300是1,300,而R将其视为字符。

我试图通过将","替换为空并将字段转换为整数来解决这个问题。我不想在每个具有该问题的列上使用gsub。我宁愿将具有该问题的列存储为一个向量,并使用一个函数或循环来处理所有列。

我尝试使用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在RAM中排序,键连接可能对非常大的数据具有进一步的速度优势。

0
0 Comments

读取文件中的数字以字符形式存储,其中使用逗号作为小数分隔符。想要直接将这些列以十进制形式读取,而不是作为字符串:data.table::fread()默认情况下可以识别十进制分隔符dec=','。可能需要使用fread(..., colClasses=(...) )参数来指定整数列:

myColClasses <- rep('string',100) # 例如...
myColClasses[intColList] <- 'integer'
# ...根据需要修复其他colClass...
ItemStats_2014 <- fread('your.csv', colClasses=myColClasses)

这种方法比将其读取为字符串,然后再转换要简单、快速,而且占用的内存要少得多。

这是一个很好的技巧,可能有效,我喜欢这个答案,但是有很多列,我需要花费很多时间整理它们。

所以只需试用fread(..., nrows=100)。然后使用myColClasses <- sapply(df, class)获取列类的命名向量。可以使用as.vector()names()分别获取组件。根据需要进行修复,将其放入代码中,然后使用fread('your.csv', colClasses=myColClasses)重新读取。相信我,这样会让你的生活变得更加简单。这不会花费时间,而且可以通过编程方式完成。(顺便说一句,CSV列通常具有命名约定,可以通过grepgreplgsub()从名称中推断其类型)

这里没有“可能”,我已经这样做了好几年了。只需要学会一次如何做,就再也不用回头了。

有用的链接:Programmatically determine the data types of a data frame's columns

谢谢!我一直在寻找一种只调用列名和类的方法,非常有效。

0
0 Comments

问题的出现原因是:想要将多列整数数据作为字符串读取,并尝试使用gsub函数去除逗号并将其转换回整数类型。然而,直接使用gsub函数处理整数列会导致数据类型转换错误。

解决方法是使用dplyr包中的mutate_at函数来选择多列并对其应用转换操作。mutate_at函数可以从一个列表或使用dplyr选择器函数来选择列,然后对每一列应用一个或多个函数。在gsub函数中的"."表示mutate_at函数传递给它的每一列,可以将其视为function(x)中的"x"。

以下是解决方法的具体代码示例:

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

其中,ItemStats_2014是要处理的数据框,intColList是包含要处理的整数列的列名列表。在funs函数中,使用gsub函数去除逗号,并使用as.integer函数将字符串转换为整数类型。通过使用mutate_at函数,可以对多个整数列进行相同的处理操作。

通过以上解决方法,可以读取多个整数列作为字符串,并使用gsub函数去除逗号,并将其转换回整数类型。这样就可以正确处理数据类型转换的问题。

0