根据在R中打开的csv文件中的名称数据生成函数

时间:2014-06-30 14:28:49

标签: r function

我有一个变量名称和权重的数据框。

示例:

Names <- c("a","b","c")
Weightings <- c(1,2,3)
df <- cbind(Names,Weightings)

我需要从这些数据中生成一个函数。

myfun <- function(x,data){
data[x,"a"]*1+data[x,"b"]*2+data[x,"c"]*3}

我有另一个名为data的数据框,其中列名与a,b和c匹配,我将myfun应用于所有行的数据。

我遇到的问题是名称和权重向量的大小可能会有所不同。我可以使用5个名字和权重,但我希望它能够生成新功能“myfun”。

Newnames <- c("a","b","c","d","e")
NewWeightings <- c(1,2,3,4,5)

myfun <- function(data){
data[x,"a"]*1+data[x,"b"]*2+data[x,"c"]*3+data[x,"d"]*4+data[x,"e"]*5}

是否有一种简单的方法可以自动创建此功能,因此我可以为某人提供代码,以及列名和权重的.csv文件,他们可以生成新功能。

1 个答案:

答案 0 :(得分:0)

这样的策略怎么样?我们使用函数来创建函数

getMyFunction <- function(columns, weights)  {
    stopifnot(length(columns)==length(weights))
    function(x, data) {
        rowSums(data[x, columns] * weights)
    }
}

基本上rowSums负责添加,我们一次指定列的向量,默认的*是元素的,因此负责权重。

然后我们构建一个像

这样的函数
Names <- c("a","b","c")
Weightings <- c(1,2,3)
myFun <- getMyFunction(Names, Weightings)

我们可以将它与

一起使用
dd<-data.frame(a=c(1,1), b=c(1,2), c=c(1,3))

myFun(1,dd)
# [1] 6
myFun(2,dd)
# [1] 13
myFun(1:2,dd)
# [1] 6 13