我在超过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中。
答案 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) ...
。