用lappy去parse(替换())

用lappy去parse(替换()),r,lapply,substitution,R,Lapply,Substitution,我想结合使用一个小函数和lappy()为数据帧添加标签 我有以下代码: df1 <- data.frame(c(1,2,3), c(3,4,5)) df2 <- data.frame(c(6,7,8), c(9,10,11)) f.generate.name <- function(x) { x$name <- deparse(substitute(x)) return(x) } my_list <- list(df1, df2) # This

我想结合使用一个小函数和lappy()为数据帧添加标签

我有以下代码:

df1 <- data.frame(c(1,2,3), c(3,4,5))
df2 <- data.frame(c(6,7,8), c(9,10,11))

f.generate.name <- function(x) {
  x$name <- deparse(substitute(x))
  return(x)
  }

my_list <- list(df1, df2) 


# This works fine.
f.generate.name(df1)

# This does not work.
lapply(my_list, f.generate.name)

我想要的是:

[[1]]
  c.1..2..3. c.3..4..5.   name
1          1          3 df1
2          2          4 df1
3          3          5 df1

[[2]]
  c.6..7..8. c.9..10..11.   name
1          6            9 df2
2          7           10 df2
3          8           11 df2
不使用循环的最佳方法是什么?如何调整lappy()函数或我创建的函数以获得所需的结果?

Base R
lappy()
不能迭代多个参数。在本例中,您可以使用始终返回列表的
mappy()
或其包装器
Map()

Map(f = function(x, y){
    x$name <- y
    x }, 
  my_list, 
  names(my_list))
$df1
  c.1..2..3. c.3..4..5. name
1          1          3  df1
2          2          4  df1
3          3          5  df1

$df2
  c.6..7..8. c.9..10..11. name
1          6            9  df2
2          7           10  df2
3          8           11  df2

真正的问题是这些名字是从哪里来的?问题中的未命名列表(如
my_list
)丢失了
df1
df2
名称,我们可以通过查看其内部结构看到:

dput(my_list)  # no df1 or df2 seen
## list(structure(list(c.1..2..3. = c(1, 2, 3), c.3..4..5. = c(3, 
## 4, 5)), class = "data.frame", row.names = c(NA, -3L)), structure(list(
##     c.6..7..8. = c(6, 7, 8), c.9..10..11. = c(9, 10, 11)), class = 
## "data.frame", row.names = c(NA, 
## -3L)))
因此,我们首先需要创建一个命名列表,或者提供一个名称向量。我们仅使用基本R来显示这两个

名单 首先创建数据帧的命名列表,然后使用Map,如图所示:

L <- mget(ls("^df"))  # create named list
Map(data.frame, L, name = names(L))

问题是,您使用
df1
df2
的副本创建
my_list
,而
my_list
中的副本不称为
df1
df2
。那么,在一个只将
my_list
作为参数的函数中,
df1
df2
的名称从何而来?如果你做了
my_list@AllanCameron就很容易了。但是,当然可以更改为
my_list,但是还有其他方法,比如
lappy(名称(my_list),函数(x){my_list[[x]]]$name您是否发现任何建议的解决方案有帮助?如果有,请将它们标记为社区已意识到。否则,请解释缺失的内容。谢谢
dput(my_list)  # no df1 or df2 seen
## list(structure(list(c.1..2..3. = c(1, 2, 3), c.3..4..5. = c(3, 
## 4, 5)), class = "data.frame", row.names = c(NA, -3L)), structure(list(
##     c.6..7..8. = c(6, 7, 8), c.9..10..11. = c(9, 10, 11)), class = 
## "data.frame", row.names = c(NA, 
## -3L)))
L <- mget(ls("^df"))  # create named list
Map(data.frame, L, name = names(L))
my_list <- list(df1, df2) # unnamed list as in question
Map(data.frame, my_list, name = c("df1", "df2"))
add_names <- function(...) {
  mc <- match.call()
  Map(data.frame, list(...), names = sapply(mc[-1], deparse))
}

add_names(df1, df2)