rbind函数中的多个数据帧

时间:2014-08-14 20:49:31

标签: r get ls rbind do.call

我在SO下面找到了这个代码行,它在函数外部作为魅力来识别数据帧列表并使用rbind加入它们。

    mylist<-ls(pattern='leg_')
    mleg <- do.call(rbind, lapply(mylist, get))

但是当我把它放在循环中时,我收到一条错误消息。我已尝试在函数和这些工作的各个步骤中进行故障排除,但我可能会遗漏导致此错误的内容。

            for(i in 1:(length(blg_idx))){
                assign(paste(deparse(substitute(leg_)),i,sep=''),l_merge(get(paste(deparse(substitute(blg)),i,sep='')),get(paste(deparse(substitute(bsg)),i,sep=''))))
            }

            mylist<-ls(pattern='leg_')

            #return(mylist) # this returns a good list of dataframes

            #mlegleg <- rbind(leg_1,leg_2) # this works 

            mleg <- do.call(rbind, lapply(mylist, get))

            return(mleg)
            } #end function read_leg

            Error in FUN(c("leg_1", "leg_2")[[1L]], ...) : 
              object 'leg_1' not found

当我从函数返回mylist时,它能够识别所有数据帧并列出它们。当我选择在调试时返回那些时,该函数能够返回leg_1或leg_2数据帧。

            [1] "leg_1" "leg_2"

任何帮助?

更新

我找到了另一个实现我需要的东西,但我确信它的效率很低,尽管我的数据帧列表最多只有4个

            for(i in 1:(length(blg_idx))){
                assign(paste(deparse(substitute(leg_)),i,sep=''),l_merge(get(paste(deparse(substitute(blg)),i,sep='')),get(paste(deparse(substitute(bsg)),i,sep=''))))
            }

            mylist<-ls(pattern='leg_')

            #return(mylist)
            #mlegleg <- rbind(leg_1,leg_2) # this works 
            # mleg <- do.call(rbind, lapply(mylist, get))

            mleg <- leg_1

            for(i in 2:(length(blg_idx))){
                mleg <- rbind(leg,get(paste(deparse(substitute(leg_)),i,sep='')))
            }   

            return(mleg)
            } #end read_leg

更新2

这是我面临的问题的可重现的例子。出于某种原因,请做一些事情。 get无法处理为函数内生成的数据帧生成的mylist参数。

    read_date <- function(x){
    pur_1 <- data.frame(sku=859, X = sample(1:10),Y = sample(c("yes", "no"), 10, replace = TRUE))
    pur_2 <- data.frame(sku=859, X = sample(11:20),Y = sample(c("yes", "no","na"), 10, replace = TRUE))

    mylist<-ls(pattern='pur_')

    pur_final <- do.call(rbind, lapply(mylist, get))
    #fancier version that I want to achieve is below
    #assign(paste('pur_',eval(pur_1$sku[1]),sep=''),do.call(rbind, lapply(mylist, get)))
    return(pur_final)
}

read_date()

错误讯息是

  

read_date()       FUN错误(c(&#34; pur_1&#34;,&#34; pur_2&#34;)[[1L]],...):object&#39; pur_1&#39;找不到

更新3 对于这篇文章的非常规管理,我感到很遗憾,但我的下一篇文章会更好。

这是我偶然发现的,除了我之外,对我有用。

pur_final <- do.call(rbind, mget(paste0("pur_", 1:2),envir = as.environment(-1)))

但是下一个不那么大的问题是抑制添加到数据帧的row.names。任何在此上下文中禁止row.names的建议。

    >   read_date()
             sku  X   Y
    pur_1.1  859  8 yes
    pur_1.2  859  4  no
    pur_1.3  859  3 yes
    ....
    pur_2.8  859 14  na
    pur_2.9  859 13  na
    pur_2.10 859 19  no
    >  

3 个答案:

答案 0 :(得分:2)

您没有可用于测试此解决方案的可重现示例,但请查看get的帮助页面并尝试此操作:

mleg <- do.call(rbind, lapply(mylist, get, envir = globalenv() ))

答案 1 :(得分:0)

上面的答案包含您问题的关键:envir = globalenv() 我花了一段时间才意识到R将为每个功能创建一个私有环境。在这个私人环境中,你的其他变量不存在。也就是说,除非您通过使用envir参数告诉您的函数查看全局环境。

这是一个应该将字符串作为输入,然后识别全局环境中包含其名称中的文本字符串的所有变量(例如数据帧)的函数。然后它将尝试绑定这些变量(数据框)。

如果所有变量都是具有相同列名的数据帧,则它应返回单个绑定数据帧。 myBindedDF <- mergeCompatibleTables("mypattern")

bindCompatibleTables <- function(x){
  if(is.character(x)){
  mylist <-   grep(x, ls(pos = 1), value=T)
  mergedDF <- do.call(rbind,  mget(mylist,envir = as.environment(1)))

  return(bindedDF)
  } else {
    stop("Input is not a character string")
  }
}

答案 2 :(得分:0)

反应迟到,但我遇到的问题与更新2 类似,其中“找不到对象'pur_1'”。

例如,如果您想在函数中使用以下内容时,以“ pur_”开头的数据帧数量未知,则为:

mylist <- ls(pattern='pur_')
mleg <- do.call(rbind, lapply(mylist, get))

然后,您需要在函数中指向正确的环境:

mylist <- ls(pattern='pur_')
mleg <- do.call(rbind, lapply(mylist, get, env=environment()))