在R中使用ifelse()将变量分配给tbl_df / data.frame对象会导致R的内存不足

贤治

我有一个包含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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用循环时tbl_df和data.frame的区别

使用data()从“ R”包中加载数据集,直接将其分配给变量?

将data.table列分配给R中的变量

将运算符分配给R变量

为什么使用`clone`创建进程会导致内存不足故障?

分解EF对象将导致Serilog内存不足

汇编会切断变量,导致内存不足?

导出vulkan内存分配句柄会导致设备内存不足

无法将`spec_tbl_df / tbl_df / tbl / data.frame`对象转换为函数

如何转换从Excel中从““ tbl_df”“ tbl”“ data.frame”导入的数据集。到“ xts”?

在R中的data.table中使用ifelse分配值

r data.table-将空白分配给重复值(按组)

将字符串分配给R中的变量

使用R中的IF语句将NA值分配给数字变量

将分配的对象分配给一些未分配的对象会导致内存泄漏吗?

何时将内存分配给变量

将类别值分配给r中的多个变量

使用大字节数组下载大文件会导致“内存不足”

在love2d中使用canvas会导致内存不足错误

高内存分配导致内存不足崩溃

由于setCotentView(R.layout_file_name)行的内存不足异常,导致应用程序崩溃

将列向量分配给多个data.frame对象作为公共属性

nightwatchjs:使用while循环会产生“-进程内存不足”

将JSONObject转换为JsonObject导致内存不足异常

使用存在的EF查询会抛出内存不足异常

R将函数的输出分配给变量

将函数及其条件分配给变量以供稍后在脚本中使用 - R

使用 Dio 下载大视频会导致内存不足

将值分配给从 R 中的函数返回的 data.frame 列的切片