我正在尝试将一系列重复代码转换为用户定义的函数。代码按行号引用行位置,按名称引用列(双引号)。代码按照提供的方式工作,但要重复许多列(这只是一个示例),效率很低。
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,传递列名应该有效。有什么想法吗?
答案 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)