访问lapply列名称

use*_*912 9 r

如果我在做

lapply(dataframe, function(x) {
    column.name <- #insert code here
})
Run Code Online (Sandbox Code Playgroud)

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

ton*_*nov 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"
Run Code Online (Sandbox Code Playgroud)

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

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

[[2]]
[1] "b"

[[3]]
[1] "c"
Run Code Online (Sandbox Code Playgroud)


ali*_*ire 5

您可以迭代索引,但这不是非常像 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"
Run Code Online (Sandbox Code Playgroud)

如果使用 tidyverse,purrr::imap是一个类似的方便版本,purrr::map2自动使用第一个参数的名称作为第二个参数:

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

每个简化版本均可用:对于Mapmapply、多元变量sapply(从Map技术上讲,它只是 的包装器SIMPLIFY = FALSE);对于imap,带有要简化为的类型下标的版本,例如imap_chr