我有一个变量名称和权重的数据框。
示例:
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文件,他们可以生成新功能。
答案 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