获取列表中的数据框/对象的字符串名称

时间:2015-03-11 02:47:04

标签: r

假设我在R中有一个数据帧列表。

testList <- list(df1, df2, df3)

我想要做的是将一个函数应用于列表中的每个数据框,以修改存储在环境中的数据帧。这是我试图做的伪代码:

>> modify <- function(list.of.dfs){
    for (df in list.of.dfs){
        df$some.new.variable <- some.new.value

>> df
>> (returns new df with new variable created)

这是一个简单的例子;对于列表中的每个数据帧,数据框现在将具有一个具有某个值的新变量。

我几乎找到了解决方案。基本上,它遍历列表并为每个数据框创建一个字符串命令,然后对其进行评估。但唯一的问题是,当它创建一个命令时,它会传入索引变量的字符串版本,而不是数据框的名称:

modify <- function(data.list, functionName){
  for(i in 1:length(data.list)){
    command <- paste0(varText(data.list),
                      "[[",
                      i,
                      "]] <- ",
                      varText(functionName),
                      "(",
                      varText(data.list),
                      "[[",
                      i,
                      "]])"
                      )
    evaluate <- parse(command)
    print(evaluate)
    eval(evaluate)
  }
  data.list
}

其中:

varText <- function(object){
  deparse(substitute(object))
}

因此,我需要找到一种方法来访问数据框,提取其名称,并迭代一系列具有这些数据框名称的命令。

然后,我希望能够在全局环境中访问这些已修改的数据框。

......除非有人知道更好的解决办法。

编辑:可重复的示例

假设我创建了两个数据框并将它们添加到同一个列表中:

df1 <- data.frame(rnorm(100), rnorm(100))
df2 <- data.frame(rnorm(100), rnorm(100))
test.list <- list(df1, df2)

我创建了一个功能,可以轻松编辑传入的数据框:

testFunction <- function(data.frame){
   data.frame$new.variable <- 0
}

然后我可以按照答案中的建议使用lapply

lapply(test.list, testFunction)

返回一个列表。

但是,如果您拨打df1df2,则会保持不变。已创建的内容是df1df2的修改版本,但它们存储在lapply创建的列表中。

我想能够输入

df1
df2

让他们被修改。

有没有办法做到这一点,以便您不必将列表lapply创建的元素分配给您想要访问的变量的名称?

非常感谢!

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您是否希望将函数应用于数据框列表?

在这种情况下,lapply()是您的朋友,并且比for()循环效率更高。

根据您修改后的示例,尝试以下内容:

# data
df1 <- data.frame(rnorm(100), rnorm(100))
df2 <- data.frame(rnorm(100), rnorm(100))
test.list <- list(df1, df2)

# function
out.list <- lapply(test.list, function(x) {x$.new.variable <- 0; x})

# name the df's in the list and check the output
names(out.list) <- c("df1", "df2")
str(out.list)

这会将该函数应用于列表中的每个对象,并将结果作为列表返回[使用@thelatemail的建议编辑]。

如果您想访问修改后的数据框,可以按名称调用它们:

out.list$df1

或者,如果要将df返回到全局环境,只要使用上面的步骤命名df,就可以使用以下命令:

list2env(out.list ,.GlobalEnv)

那应该做你需要的。