这里的问题是您传递了一个字符串,该字符串表示您希望使用的数据框的名称。当您在函数中调用 as.name(x) 时,您实际上是在将符号作为参数传递给 mutate,而不是该符号所引用的数据框。如果你想访问一个符号所指的对象,你需要eval那个符号,所以你可以使用eval(as.name(x))。
但是,R 中从符号名称获取对象的快捷方式是get(x),相当于eval(as.name(x)):
my_fun <- function(x) mutate(get(x), type = "exp", name = as.character(x))
result <- lapply(file_list, my_fun)
如果我们查看result 中两个数据帧的head,我们可以看到预期的结果:
lapply(result, head)
#> [[1]]
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species type name
#> 1 5.1 3.5 1.4 0.2 setosa exp iris2
#> 2 4.9 3.0 1.4 0.2 setosa exp iris2
#> 3 4.7 3.2 1.3 0.2 setosa exp iris2
#> 4 4.6 3.1 1.5 0.2 setosa exp iris2
#> 5 5.0 3.6 1.4 0.2 setosa exp iris2
#> 6 5.4 3.9 1.7 0.4 setosa exp iris2
#>
#> [[2]]
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species type name
#> 1 5.1 3.5 1.4 0.2 setosa exp iris4
#> 2 4.9 3.0 1.4 0.2 setosa exp iris4
#> 3 4.7 3.2 1.3 0.2 setosa exp iris4
#> 4 4.6 3.1 1.5 0.2 setosa exp iris4
#> 5 5.0 3.6 1.4 0.2 setosa exp iris4
#> 6 5.4 3.9 1.7 0.4 setosa exp iris4
请注意,如果您将多个相似的对象放在一个列表中,则不需要这样做。起初将数据框放在列表中感觉有点陌生,但是当您必须跨多个数据框执行操作时,它会变得容易得多。例如,您可以这样做:
iris_list <- list(iris2 = iris, iris4 = iris)
您可以使用iris_list[[1]] 和iris_list[[2]] 等轻松访问每个数据帧,这不会增加很多击键。您还可以摆脱对file_list 和单独函数的需求,因为您可以在一行中实现所有内容:
Map(function(x, y) mutate(x, type = "exp", name = y), iris_list, names(iris_list))
如果在任何时候,您希望数据帧回到您的全局环境中,您可以这样做list2env(iris_list, globalenv())