访问 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::imappurrr::map2 的类似便捷版本,它自动使用第一个参数的名称作为第二个参数:

purrr::imap(Formaldehyde, ~paste(.y, sum(.x), sep = ": "))
#> $carb
#> [1] "carb: 3.1"
#> 
#> $optden
#> [1] "optden: 2.747"

每个简化版本都可用:对于Mapmapply、多变量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 列名的主要内容,如果未能解决你的问题,请参考以下文章

在 lapply 函数中访问和保留列表名称

如何修改多个数据框而不列出它们然后使用 lapply?

从 PyQt 中的 contextMenuEvent 访问列名

Pandas 列访问,列名包含空格

在何时访问数据框的列名

ClickHouse:从同列名的select中访问源列