存储在自定义函数中的值

时间:2010-04-24 06:47:16

标签: function r dataframe

我的程序采用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)并创建一个永久对象,然后将其插入到我的函数中。

4 个答案:

答案 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你提供了一些简单的代码来解释你想要实现的目标吗?