我有一个数据框,我想用现有的列进行一些计算,并在我的数据集中创建新列,这是现有的组合...我可以在函数外轻松完成这个...但是如果我换行函数中的代码,我所做的更改(内部函数)在函数外部是不可见的...即新列不存在...
我希望示例代码能够做到这一点......
答案 0 :(得分:7)
我假设它是关于R ... R不通过引用传递参数(环境和引用类(S5)是一个例外,但这超出了当前的抽象范围)。因此,当你写
addThree<-function(x){
x<-x+3
}
4->y
addThree(y)
y
在代码末尾仍然是4,因为在函数内部,x
是y
s值的新副本,而不是y
本身(同样,不完全是,但那些是更高阶的细节。)
因此,您必须适应R的pass-by-copy方案并返回更改后的值并将其分配回您的变量(使用旧的措辞,R中没有程序):
addThree<-function(x){
return(x+3)
}
4->y
addThree(y)->y
#y is now 7
请不要担心,对于更复杂的对象,这种方法可以顺利运行,因为R是垃圾收集并且具有惰性评估。
顺便说一句,如果你想返回函数中产生的最后一个值,你可以省略return
,即addThree
的定义可能如下所示:
addThree<-function(x) x+3
答案 1 :(得分:1)
最好的方法是使用dplyr库中的mutate()
。例如:
addcol = function(dat){
dat1 = mutate(dat, x2=x1*2)
return(dat1)
}
dat是一个数据框,其中一列名为&#34; x1&#34;。使用此函数addcol()
,新数据集现在有一个名为&#34; x2&#34;的新列。这是&#34; x1&#34;的两倍,假设x1
是数字。