访问由R*apply函数处理的元素的名称
在使用R访问由R*apply函数处理的元素的名称,r,apply,lapply,R,Apply,Lapply,在使用R*apply函数时,有时需要访问apply处理函数中已处理元素的名称。为了说明清楚,首先考虑循环: 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]
*apply
函数时,有时需要访问apply处理函数中已处理元素的名称。为了说明清楚,首先考虑循环:
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
如何从匿名应用函数内部访问列名?这无法完成,除非您使用
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这里需要注意两件事:
第一:for循环没有返回值,但是lappy有。
第二:lappy不传递列名,只传递未命名的向量
因此,类似这样的解决方案是一个更好的通用解决方案:
x <- lapply(1:ncol(df),function(i){
cat('processing col', names(df)[i], '\n')
print(df[[i]])
})
x谢谢Matthew,这至少证实了我在传递列表对象(或类似对象)时无法访问名称的想法。基于名称的解决方案也是我使用的解决方案。我想知道它是否比非功能性的for
方法更有效,是否比直接使用*apply
更有效(也就是说,在不严格需要名称的情况下,不使用名称技巧)。@antonio*apply
函数只比for
的应用程序稍微快一点。当您希望遍历列表并返回结构化输出(如另一个列表)时,请使用它们。