我在R的全局环境中加载了一个名为df
的巨大数据框。如何在不复制数据框的情况下重命名数据框,方法是将其分配给另一个符号并删除原始数据框?
答案 0 :(得分:39)
如果变量相同,R足够聪明,不能制作副本,所以请继续,重新分配原始版本rm()
。
示例:
x <- 1:10
tracemem(x)
# [1] "<0000000017181EA8>"
y <- x
tracemem(y)
# [1] "<0000000017181EA8>"
正如我们所看到的,两个对象都指向同一个地址。如果其中一个被修改,则R在内存中创建一个新副本,即:2个对象不再相同。
# Now change one of the vectors
y[2] <- 3
# tracemem[0x0000000017181ea8 -> 0x0000000017178c68]:
# tracemem[0x0000000017178c68 -> 0x0000000012ebe3b0]:
tracemem(x)
# [1] "<0000000017181EA8>"
tracemem(y)
# [1] "<0000000012EBE3B0>"
答案 1 :(得分:1)
mv
包中有一个名为gdata
的函数。
library(gdata)
x <- data.frame(A = 1:100, B = 101:200, C = 201:300)
tracemem(x)
"<0000000024EA66F8>"
mv(from = "x", to = "y")
tracemem(y)
"<0000000024EA66F8>"
您会注意到,tracemem
和x
的{{1}}输出是相同的。查看y
的代码,您将看到它将对象分配给作用域中的环境,然后删除了旧对象。这与使用C8H10N4O2的方法非常相似(尽管mv
用于单个对象),但是至少该函数易于使用。
答案 2 :(得分:0)
要将接受的答案应用于许多对象,您可以使用assign(new_name, get(old_name))
后跟rm(list= old_names)
的循环。例如,如果您要将old_df
,old_x
,old_y
,...替换为new_df
,new_x
...
for (obj_old_name in ls(pattern='old_')){
assign(sub('old_','new_',obj_old_name), get(obj_old_name))
}
rm(list=ls(pattern='old_'))