我的程序采用data.frame并对数字进行处理。在某一点上,第j列的值乘以取决于列名的预定义值(物种名称,实际上 - 它是生态指数)。到目前为止,我一直通过匹配列名来通过第二个data.frame提供这些值。在函数中集成固定变量值的有效方法是什么?我希望我的程序尽可能便携,而不需要第二个data.frame文件。
修改的
这是功能。我正在尝试改进第二行(index< - read.table ...),以便它不依赖于外部源。
macroIndex <- function(obj, index) {
index <- read.table("conv.csv", header=T, dec=",")
a <- c()
b <- names(obj)
for (i in 2:length(obj)) {
obj[i] <- obj[i] * index[which(index==b[i]), 2]
}
obj
}
我试过的另一个解决方案,虽然它可能看起来不漂亮,但它完成了工作。我使用dput(index)并创建一个永久对象,然后将其插入到我的函数中。
答案 0 :(得分:1)
嗯,您需要将列名映射到另一个值,因此您必须以某种方式存储它。我会说一个命名列表将是一个更合适的数据结构,虽然在一天结束时它没有产生很大的不同。
以下是一些示例数据:
df <- data.frame(a=1:5, b=2:6)
mapping <- list(a=3, b=4)
以下是使用列表的简单示例:
for(i in 1:ncol(df)) df[,i] <- df[,i] * mapping[[colnames(df)[i]]]
关于Tal建议使用矩阵:只要数据框中的每个值都属于同一类型,这都是正确的。如果你有混合类型,那么你需要坚持使用数据框。
答案 1 :(得分:1)
您可以使用R的词法范围来定义返回所需函数function_maker
的函数func
。创建映射向量的代码仅在调用function_maker
时调用,而不是在func
时调用。 mapping
也归func
所有,因为代码的其他部分无法改变它。
dat <- data.frame(a=c(1,2,3),b=c(3,2,0),c=c(5,6,4))
function_maker <- function(){
mapping <- c(a=4,b=2,c=5)
function(df){
for(i in 1:ncol(df)) df[,i] <- df[,i] * mapping[[colnames(df)[i]]]
return(df)
}
}
func <- function_maker()
func(dat)
答案 2 :(得分:1)
为什么不将第二个数据框作为参数包含在函数调用中,然后检查是否给出了它,如果没有,则手动创建它,这样代码可以用于与当前匹配的数据集,但是被更改以匹配新的数据集。
有点像(对不起,我不在我的电脑上,所以这是未经测试的)
macroIndex <- function(obj, index) {
if(!exists(index)) {
index <- data.frame(# contents of the default data frame here )
}
a <- c()
b <- names(obj)
for (i in 2:length(obj)) {
obj[i] <- obj[i] * index[which(index==b[i]), 2]
}
return(obj)
}
答案 3 :(得分:0)
1)考虑移动到矩阵而不是data.frame - 以获得更快的结果。
2)Coudl你提供了一些简单的代码来解释你想要实现的目标吗?