访问 lapply 列名
Posted
技术标签:
【中文标题】访问 lapply 列名【英文标题】:Accessing lapply column names 【发布时间】:2014-07-16 17:54:28 【问题描述】:如果我在做
lapply(dataframe, function(x)
column.name <- #insert code here
)
我如何能够访问 lapply 函数当前正在处理的列的名称?我想将列的名称分配给变量 column.name,如代码中所示。只是澄清一下,是的,column.name 会随着 lapply 的每次迭代而改变。
【问题讨论】:
列名应该是lapply()
返回的每个列表元素的名称。这能解决您的问题吗?
你可以lapply(seq_along(dataframe), function(i) names(dataframe)[i])
,但使用“for”循环可能更方便,因为你也想修改你的“数据框”。
我更喜欢编写函数,以便它对名称本身起作用——这样输出将是一个命名列表。类似lapply(names(dataframe), function(x) dataframe[x]
@TARehman 不,我知道当 'lapply()' 返回时我会得到列名。我需要函数中的列名。我想我只能通过使用其他两位评论者的建议来解决问题。
@TARehman 在 R 中,一切皆有可能 :) 见我的回答。
【参考方案1】:
其实是有办法的。
df <- data.frame(a = 1:2, b = 3:4, c = 5:6)
lapply(df, function(x) names(df)[substitute(x)[[3]]])
$a
[1] "a"
$b
[1] "b"
$c
[1] "c"
但这应该作为最后的手段。相反,使用类似的东西(在 cmets 中给出了另一个选项)
lapply(seq_along(df), function(x) names(df[x]))
[[1]]
[1] "a"
[[2]]
[1] "b"
[[3]]
[1] "c"
【讨论】:
啊,这很直观。但我想第二种方法也可以。【参考方案2】:您可以迭代索引,但这不是非常类似于 R 的代码。更直接的方法是使用Map
,这是lapply
的多变量版本,它在传递给它的任何参数上并行迭代适当数量的函数:
Map(function(value, name)paste(name, sum(value), sep = ": "),
Formaldehyde,
names(Formaldehyde))
#> $carb
#> [1] "carb: 3.1"
#>
#> $optden
#> [1] "optden: 2.747"
如果使用 tidyverse,purrr::imap
是 purrr::map2
的类似便捷版本,它自动使用第一个参数的名称作为第二个参数:
purrr::imap(Formaldehyde, ~paste(.y, sum(.x), sep = ": "))
#> $carb
#> [1] "carb: 3.1"
#>
#> $optden
#> [1] "optden: 2.747"
每个简化版本都可用:对于Map
、mapply
、多变量sapply
(其中Map
在技术上只是SIMPLIFY = FALSE
的包装);对于imap
,带有要简化为的类型的下标的版本,例如imap_chr
.
【讨论】:
【参考方案3】:How to pass a variable into the function while using lapply
具有两个变量的 lapply 所以我不必继续为每个状态重写函数。
library(tidycensus)
get_Census <- function(x,y)
get_decennial(geography = "block group",
variables = "P001001",
sumfile = "sf1",
key = mykey,
state = x, county = y,year = "2000",
geometry = FALSE)
CO<-c("067","073","113")
lapply(CO,get_Census,x="06")
【讨论】:
这让您可以将变量设置为所有迭代的单个值,但不适用于迭代多个状态。一个简单的选择是使用Map
,这是lapply
的多元版本,您可以传递一个州向量和一个相应的县向量。如果你使用的是 tidyverse,purrr::map2
会做同样的事情。以上是关于访问 lapply 列名的主要内容,如果未能解决你的问题,请参考以下文章