我在另一篇文章中提出了几乎相同的问题,但只要求列名,并收到了一个完美的解决方案,现在我需要的是变量全名。
我在函数内部使用“deparse(substitute(x))”来获取作为参数传递的变量名。它工作得很好...但不适用于“lapply”
myfun <- function(x)
{
return(deparse(substitute(x)))
}
a <- c(1,2,3)
b <- c(4,5,5)
df<-data.frame(a,b)
myfun(df$a)
[1] "df$a"
但是,用“laply "
lapply(df, myfun)
$a
[1] "X[[i]]"
$b
[1] "X[[i]]"
我怎样才能得到'lapply'中的变量名?
谢谢
3条答案
按热度按时间7lrncoxx1#
当您将 Dataframe 传递给
lapply
时,它将使用双方括号通过 numerical 索引来迭代列,而不是使用$
访问器通过 name 索引来迭代列。它等效于使用以下循环:因此,简单的
deparse(substitute(x))
在lapply
中无法工作。您不是在 * 恢复 * 列名,而是需要从调用堆栈中 * 重构 * 列名。这充满了警告和陷阱,但一个(相对)简单的方法是:这意味着如果直接调用,您的函数仍然可以工作:
但也适用于
lapply
它是专门编写来覆盖直接使用或在
lapply
中使用的。如果你想扩展它的使用来在其他函数调用中工作,比如Map
或各种purrr
Map函数,那么这些必须由它们自己的if
子句专门覆盖。x759pob22#
下面是另一个解决方案,它有点冗长,Allen的解决方案要好得多:
由reprex package(v2.0.1)于2023年2月9日创建
zpjtge223#
我们可以定义一个字符串'col_name'来获取函数中数据框列的名称。例如,如果col_name是“a”,dfcol_name从数据框中提取“a”列。然后我们可以使用paste()函数来连接字符串'df$'和'col_name':
输出
如果我们想分配任何数据,我们可以先进行分配,然后运行lapply,例如:
输出
希望这能帮上忙。