l_ply:如何将列表的name属性传递给函数?

dna*_*irl 12 r list plyr

假设我有一个像这样的R列表:

> summary(data.list)
                                 Length Class      Mode
aug9104AP                        18     data.frame list
Aug17-10_acon_7pt_dil_series_01  18     data.frame list
Aug17-10_Picro_7pt_dil_series_01 18     data.frame list
Aug17-10_PTZ_7pt_dil_series_01   18     data.frame list
Aug17-10_Verat_7pt_dil_series_01 18     data.frame list
Run Code Online (Sandbox Code Playgroud)

我想使用处理列表中的每个data.frame l_ply,但我还需要将名称(例如aug9104AP)与data.frame一起传递到处理函数中.就像是:

l_ply(data.list,function(df,...) {

    cli.name<- arg_to_access_current_list_item_name

    #make plots with df, use cli.name in plot titles
    #save results in a file called cli.name

  }, arg_to_access_current_list_item_name
)
Run Code Online (Sandbox Code Playgroud)

应该arg_to_access_current_list_item_name是什么?

had*_*ley 11

最简单的方法是从名称开始,然后使用它们来提取您感兴趣的位:

l_ply(names(data.list),function(name,...) {
  df <- data.list[[name]]
)
Run Code Online (Sandbox Code Playgroud)

您还可以使用m_ply传递名称和数据:

m_ply(cbind(names(data.list), data.list), function(name, df, ...) {
   ...
}
Run Code Online (Sandbox Code Playgroud)


Jor*_*eys 3

如果您一一传递它们,您可以使用 deparse(substitute(arg)) ,例如:

test <- function(x){
       y <- deparse(substitute(x))
       print(y)
       print(x)
 }

 var <- c("one","two","three")
 test(var)
[1] "var"
[1] "one"   "two"   "three"
Run Code Online (Sandbox Code Playgroud)

对于 l_ply,您必须将属性添加到列表本身,例如:

for(i in 1:length(data.list)){
    attr(data.list[[i]],"name") <- names(data.list)[i]
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用 attr :

cli <- attr(x,"name")
Run Code Online (Sandbox Code Playgroud)

干杯