当使用R *apply
函数时,有时人们想要访问应用处理函数内的已处理元素的名称。为清楚起见,首先考虑这个for循环:
df=data.frame(x=1:3, y=11:13)
for(i in 1:ncol(df)){
cat('processing col', names(df)[i], '\n')
print(df[[i]])
}
# processing col x
# [1] 1 2 3
# processing col y
# [1] 11 12 13
转移到应用版本时:
lapply(df, function(col){
## processing col ??
col})
# $x
# [1] 1 2 3
#
# $y
# [1] 11 12 13
如何从匿名应用函数中访问列名?
答案 0 :(得分:2)
除非您使用for
完成此操作,否则无法完成此操作。如果要返回包含结果的结构(例如,将附加到列表中),*apply
可能仍然适用。
x <- lapply(names(iris), function(name) {
cat("processing col", name, "\n")
iris[[name]]
})
## processing col Sepal.Length
## processing col Sepal.Width
## processing col Petal.Length
## processing col Petal.Width
## processing col Species
names(x) <- names(iris)
x
现在是一个包含数据框iris
的列的列表。
答案 1 :(得分:0)
这里有两点需要注意: 第一个:for循环,没有返回值,但lapply确实如此。 第二:lapply不传递列名,只传递未命名的向量。
这样的东西就是更好的通用解决方案:
x <- lapply(1:ncol(df),function(i){
cat('processing col', names(df)[i], '\n')
print(df[[i]])
})
如果您不需要,可以稍后弃掉x(rm(x)
)。
请注意,如果必须替换大量for循环,这将更容易!