访问lapply列名称

时间:2014-07-16 17:54:29

标签: r

如果我在做

lapply(dataframe, function(x) {
    column.name <- #insert code here
})

我如何能够访问lapply函数当前正在处理的列的名称?我想将列的名称分配给变量column.name,如代码中所示。只是澄清一下,是的,column.name会随着lapply的每次迭代而改变。

3 个答案:

答案 0 :(得分:8)

实际上有一种方法。

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"

但这应该作为最后的手段。相反,使用类似的东西(评论中给出另一个选项)

lapply(seq_along(df), function(x) names(df[x]))
[[1]]
[1] "a"

[[2]]
[1] "b"

[[3]]
[1] "c"

答案 1 :(得分:4)

您可以遍历索引,但这不是类似R的代码。更直接的方法是使用Maplapply的多变量版本,它会在传递给它的任何参数中并行迭代适当arity的函数:

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

答案 2 :(得分:1)

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")