2

我的程序需要一个 data.frame 并处理数字。在某一时刻,来自第 j 列的值乘以预定义的值,该值取决于列名(实际上是物种名称 - 它是生态索引)。到目前为止,我一直在通过第二个 data.frame 通过匹配列名来提供这些值。在函数中集成固定变量值的有效方法是什么?我希望我的程序尽可能便携,而不需要第二个 data.frame 文件。

编辑

这就是功能。我正在尝试改进第二行(索引 <- 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

4 回答 4

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 对使用矩阵的建议:只要数据框中的每个值都属于同一类型,这是正确的。如果您有混合类型,那么您需要坚持使用数据框。

于 2010-04-24T13:57:59.000 回答
1

您可以使用 R 的词法范围来定义function_maker返回所需函数的函数func。创建映射向量的代码仅在被调用时function_maker调用,而不是在何时调用funcmapping也归您所有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)
于 2010-04-24T18:08:34.820 回答
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)
}
于 2010-04-25T08:32:03.773 回答
0

1)考虑移动到矩阵而不是 data.frame - 以获得更快的结果。

2)你可以提供一些简单的代码来解释你想要实现的目标吗?

于 2010-04-24T08:27:57.830 回答