Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问由R*apply函数处理的元素的名称_R_Apply_Lapply - Fatal编程技术网

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

访问由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]

在使用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] 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
的应用程序稍微快一点。当您希望遍历列表并返回结构化输出(如另一个列表)时,请使用它们。