访问由R *应用函数处理的元素的名称

时间:2014-04-18 22:15:01

标签: r apply lapply

当使用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

如何从匿名应用函数中访问列名?

2 个答案:

答案 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循环,这将更容易!