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

R 将多个整数列读取为字符串,尝试gsub并转换回整数,r,file-io,gsub,fread,number-formatting,R,File Io,Gsub,Fread,Number Formatting,在一个超过100列的数据框架中,我有大约30列。我正在读取的文件将其数字存储为字符。换句话说,1300是1300,R认为它是一个字符 我试图通过将“”和“替换为零并将字段转换为整数来解决该问题。我不想在每个有问题的列上使用gsub。我宁愿将列存储为有问题的向量,并对所有列执行一个函数或loop 我尝试过使用lappy,但不确定将什么作为“x”变量 这是我的函数,下面有一个错误 ItemStats_2014[intColList] <- lapply(ItemStats_2014[intCo

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

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

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

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

ItemStats_2014[intColList] <- lapply(ItemStats_2014[intColList],
    as.integer(gsub(",", "", ItemStats_2014[intColList])) )
ItemStats_2014[intColList]
我正在读取的文件将其数字存储为字符[以逗号作为十进制分隔符]

只需直接将这些列读取为十进制,而不是字符串:
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)
mycolclass
我正在读取的文件将其数字存储为字符[以逗号作为十进制分隔符]

只需直接将这些列读取为十进制,而不是字符串:
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)

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

ItemStats_2014 <- ItemStats_2014 %>%
    mutate_at(intColList, funs(as.integer(gsub(',', '', .))))
ItemStats\u 2014%
在(intColList,funs,as.integer(gsub(',','','))处变异

mutate\u at
从列表中选择列或使用dplyr选择器功能(请参见
?选择帮助程序
),然后将一个或多个功能应用于每个列。gsub中的
指的是
mutate\u at
传递给它的每个选定列。您可以将其视为
函数(x)中的
x

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

ItemStats_2014 <- ItemStats_2014 %>%
    mutate_at(intColList, funs(as.integer(gsub(',', '', .))))
ItemStats\u 2014%
在(intColList,funs,as.integer(gsub(',','','))处变异

mutate\u at
从列表中选择列或使用dplyr选择器功能(请参见
?选择帮助程序
),然后将一个或多个功能应用于每个列。gsub中的
指的是
mutate\u at
传递给它的每个选定列。您可以将其视为
函数(x)中的
x

首先不要将整数作为字符串读入,而是将其作为整数读入
fread()
将逗号理解为十进制分隔符对于未来,就
lappy
本身而言,您可以在
lappy
调用中这样定义函数:
lappy(ItemStats_2014[intColList],函数(x)作为.integer(gsub(“,”,x))
嘿,我给了您正确的编程答案,包括如何通过编程轻松地查找ColClass,即使在100列dfs上也是如此。这是可伸缩的,不会泄漏内存和浪费CPU,不像不必要地将整数读取为字符串,然后进行转换。查看gc()以了解在数字字符串上浪费了多少内存。首先不要将整数作为字符串读入,而是将它们作为整数读入
fread()
将逗号理解为十进制分隔符对于未来,就
lappy
本身而言,您可以在
lappy
调用中这样定义函数:
lappy(ItemStats_2014[intColList],函数(x)作为.integer(gsub(“,”,x))
嘿,我给了您正确的编程答案,包括如何通过编程轻松地查找ColClass,即使在100列dfs上也是如此。这是可伸缩的,不会泄漏内存和浪费CPU,不像不必要地将整数读取为字符串,然后进行转换。看看gc(),看看你在数字字符串上浪费了多少内存。这是一个很好的英特尔,可能会起作用,我喜欢这个答案,但是有很多列我会花很多时间来整理。@alexb523:所以只要试一下
fread(…,nrows=100)
。然后使用MyCollasses没有“可能”,我已经做了很多年了。只要学会如何做一次,不要回头看。帮助:谢谢!我一直在寻找只调用列名和类的方法。效果很好。这是一个很好的英特尔,可能会起作用,我喜欢这个答案,但我会花很多时间来整理它。@alexb523:所以只要做一个试用
fread(…,nrows=100)
。然后使用MyCollasses没有“可能”,我已经做了很多年了。只要学会如何做一次,不要回头看。帮助:谢谢!我一直在寻找只调用列名和类的方法。效果很好。