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

时间:2010-08-23 14:00:46

标签: list r 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

我想使用l_ply处理列表中的每个data.frame,但我还需要将名称(例如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
)

arg_to_access_current_list_item_name应该是什么?

3 个答案:

答案 0 :(得分:11)

从名字开始最简单,然后用它们来提取你感兴趣的位:

l_ply(names(data.list),function(name,...) {
  df <- data.list[[name]]
)

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

m_ply(cbind(names(data.list), data.list), function(name, df, ...) {
   ...
}

答案 1 :(得分: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"

对于l_ply,您将不得不求助于将属性添加到列表本身,例如:

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

然后你可以使用attr:

cli <- attr(x,"name")

干杯

答案 2 :(得分:3)

Joris回答是最干净的方法。我会添加一个提取属性的函数:

for(ename in names(data.list)) {
    attr(data.list[[ename]], "ename") <- ename
}
ename <- function(x) attr(x, "ename") # states for element name

所以你用它作为:

l_ply(data.list, function(df, ...) {
    cli.name<- ename(df)
    # make plots, save results using cli.name
})

我通常使用这种方法:

l_ply(names(data.list), function(cli.name, df=data.list[[cli.name]], ...) {
    # make plots, save results using cli.name
})

迭代名称并使用它们从原始列表中提取data.frame


只是因为通知有一个黑客。我不推荐它,因为它弄乱了框架而且很难控制 使用llply实际上是for循环的事实,您可以从函数内部提取实际步骤。可以使用get和正确的环境来完成。

l_ply(data.list, function(df, ...) {
    cli.name<- names(data.list)[get("i",parent.frame())]
    # make plots, save results using cli.name
})