将多个整数列读取为字符串,尝试使用gsub函数并转换回整数。
将多个整数列读取为字符串,尝试使用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中排序,键连接可能对非常大的数据具有进一步的速度优势。
读取文件中的数字以字符形式存储,其中使用逗号作为小数分隔符。想要直接将这些列以十进制形式读取,而不是作为字符串: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列通常具有命名约定,可以通过grep
、grepl
或gsub()
从名称中推断其类型)
这里没有“可能”,我已经这样做了好几年了。只需要学会一次如何做,就再也不用回头了。
有用的链接:Programmatically determine the data types of a data frame's columns
谢谢!我一直在寻找一种只调用列名和类的方法,非常有效。
问题的出现原因是:想要将多列整数数据作为字符串读取,并尝试使用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函数去除逗号,并将其转换回整数类型。这样就可以正确处理数据类型转换的问题。