如果我在做
lapply(dataframe, function(x) {
column.name <- #insert code here
})
我如何能够访问lapply函数当前正在处理的列的名称?我想将列的名称分配给变量column.name,如代码中所示。只是澄清一下,是的,column.name将随着lapply的每次迭代而更改。
其实是有办法的。
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"
您可以遍历索引,但这不是非常像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
.
如何在使用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")