我有一个包含4811616行的数据集,其中包含变量A,B和C。变量C具有NA,并且我想为NA的个案分配零。我进行如下操作:
df$A <- ifelse(is.na(df$A), 0, df$A)
而且我得到一个错误,说R用完了内存。这是不可能的,因为我正在Windows 7上运行64位版本的R,具有36Gb的内存,memory.limit(size=34000)
用于向R分配内存,环境中的唯一对象是我的数据帧128.5 Mb。此外,print(object.size(ifelse(is.na(df$A), 0, df$A)),units="MB)
返回36.7 Mb,因此ifelse
语句产生的向量不能太大。
实际上,将向量分配给变量x
不会导致R用尽内存。是当我尝试将其分配给我时tbl_df
,问题才发生。如果我将其分配给,也会发生这种情况data.frame(tbl_df)
。
任何人都可以帮助我发现正在发生的事情并找到解决方法吗?
你可以试试 data.table
library(data.table)
setDT(df)[is.na(A), A:=0][]
如果需要替换所有列中的“ NA”,则可以使用set
它,这将非常有效。
for(j in seq_len(ncol(df))){
set(df, i=which(is.na(df[[j]])), j=j, value=0)
}
使用更大的数据集
set.seed(495)
df1 <- as.data.frame(matrix(sample(c(NA,1:5),3*4811616,
replace=TRUE), ncol=3, dimnames=list(NULL, LETTERS[1:3])))
system.time(setDT(df1)[is.na(A), A:=0])
# user system elapsed
# 0.026 0.002 0.027
只是与@lukeA的方法进行比较
system.time(df1$A[is.na(df1$A)] <- 0)
# user system elapsed
# 0.140 0.004 0.144
set.seed(25)
df <- as.data.frame(matrix(sample(c(NA,1:5), 3*20,
replace=TRUE), ncol=3, dimnames=list(NULL, LETTERS[1:3])))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句