传递数据帧位置,在功能内不起作用

时间:2018-02-08 19:58:38

标签: r row user-defined-functions

我正在尝试将一系列重复代码转换为用户定义的函数。代码按行号引用行位置,按名称引用列(双引号)。代码按照提供的方式工作,但要重复许多列(这只是一个示例),效率很低。

data1<-data.frame(A=1:4,B=c(8,11,10,9999),C=c(9999,8,4,10),D=c(21:24))
namescol<-c("valueA","valueB","valueC","valueD")
colnames(data1)<-namescol

if(data1[1,"valueB"]!=9999){
data1[2,"valueA"]<-data1[1,"valueB"]
}
if(data1[1,"valueC"]!=9999){
data1[3,"valueA"]<-data1[1,"valueC"]
}
if(data1[1,"valueD"]!=9999){
data1[4,"valueA"]<-data1[1,"valueD"]
}

我将if语句块转换为单个函数,替换了列的名称和函数中的行号。

testfcn<-function(column,x){
if(data1[1,column]!=9999){
data1[x,"valueA"]<-data1[1,column]
}

testfcn("valueB",2)
testfcn("valueC",3)
testfcn("valueD",4)
}

此函数不会产生错误,但不会将第一行中的值替换为第一列的后续行。根据这篇文章Pass a data.frame column name to a function,传递列名应该有效。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

R函数不直接修改函数内的数据框等对象。函数使用具有相同原始值的对象副本。您正在更改data1的值,但仅限于函数范围内。尝试在函数末尾返回data1,并将函数调用的结果分配回data1对象:

testfcn<-function(column,x) {
  if(data1[1,column]!=9999){
    data1[x,"valueA"]<-data1[1,column]
  }
  data1 # this returns the modified data1
}

data1 <- testfcn("valueD",4)