【发布时间】:2016-01-16 03:50:36
【问题描述】:
我将data.frame 作为参数传递给想要更改内部数据的函数:
x <- data.frame(value=c(1,2,3,4))
f <- function(d){
for(i in 1:nrow(d)) {
if(d$value[i] %% 2 == 0){
d$value[i] <-0
}
}
print(d)
}
当我执行f(x) 时,我可以看到里面的data.frame 是如何被修改的:
> f(x)
value
1 1
2 0
3 3
4 0
但是,我传递的原始data.frame是未修改的:
> x
value
1 1
2 2
3 3
4 4
通常我已经通过返回修改过的来克服这个问题:
f <- function(d){
for(i in 1:nrow(d)) {
if(d$value[i] %% 2 == 0){
d$value[i] <-0
}
}
d
}
然后调用重新分配内容的方法:
> x <- f(x)
> x
value
1 1
2 0
3 3
4 0
但是,我想知道这种行为在一个非常大的data.frame 中的影响是什么,是为方法执行而增长的新行为吗?这样做的 R-ish 方式是什么?
有没有办法修改原来的而不在内存中创建另一个?
【问题讨论】:
-
R 按设计复制与修改。使用更大范围的对象(可能使用非标准评估来获取对象的名称)和/或给
data.table一个旋转(它有许多就地习语并且专为更大的数据集而设计)。跨度> -
r-ish 方法是不使用循环。对你来说什么是“大”
-
你可能对data.table package感兴趣。
标签: r dataframe pass-by-reference