【问题标题】:Merger of two data frames results in multiple data frames in R [closed]两个数据帧的合并导致R中的多个数据帧[关闭]
【发布时间】:2013-01-03 02:35:10
【问题描述】:

我正在尝试从它们的 data.frame 结构中剥离两个数据帧,提取每个 data.frame 中的元素,并将从数据帧中提取的数据组合成一个 data.frame。这应该会产生一个由两列作为向量组成的 data.frame。请参阅下面的输出(以粗体标记)。

问题:输出包含多个 data.frame 元素,而不是包含来自输​​入数据帧的向量的单个 data.frame。

每个数据帧包含一个向量。

[EDIT^v 响应 cmets.]

到目前为止,我已经尝试了as()unlist() 的各种组合,但无济于事......

我正在尝试使用内置的 R 函数和矢量化来解决这个问题(不使用plyrloopsMerge several data.frames into one data.frame with a loopMerge many data frames from csv filesRecombining a list of Data.frames into a single data frame

可重现的代码:我无法重现错误,但这是我希望我的代码能够工作的方式:

df1<-data.frame<-c(1, 2, 3)
df2<-data.frame<-c(2, 4, 6)

output<-cbind(df1, df2)
print(output)       #Returns a data.frame
str(output)         #                     of vectors
                    #In my case however, a data.frame returns data.frames)

这会返回:

       df1 df2
[1,]   1   2
[2,]   2   4
[3,]   3   6

现实

readmultiple <- function(directory = "bigdata") {

    ....


    ....
    ....
        output <- cbind.data.frame(filename, readmultiplesum) 
        # This is probably where things go wrong
        return(output)
    }
    output <- lapply(filenames, complete.cases.sum)
    assign("Global.output", output, envir = .GlobalEnv) 
    # There is probably a better way to do this too

    if (firstoutput == 1) {
        Global.output <- merge(as(unlist(Global.output[1]), "vector"), 
                           as(unlist(output[1])), "vector") 
    # as, unlist... Not sure what's needed here
    } else {
        firstoutput <- 1
    }
    str(output)
    return(Global.output)
}

输出看起来像

[[1]]
   filename result 
          1         142 

[[2]]
   filename result
          1        521

[[3]]
   filename result
          1         324

但我希望是这样的

filename        result 

[1,]   filename[i]  142 

[2,]   filename[i]  521

[3,]   filename[i]  324

...其中 filename[i] 是文件名的索引。

str(输出) 返回

List of 2400
 $ :'data.frame':       1 obs. of  2 variables:
  ..$ filename   : Factor w/ 1 level "bigdata/001.csv": 1
  ..$ sumrows: num 142
 $ :'data.frame':       1 obs. of  2 variables:
  ..$ filename   : Factor w/ 1 level "bigdata/001.csv": 1
  ..$ sumrows: num 521
 $ :'data.frame':       1 obs. of  2 variables:
  ..$ filename   : Factor w/ 1 level "bigdata/001.csv": 1
  ..$ sumrows: num 324
 $ :'data.frame':       1 obs. of  2 variables:
  ..$ filename   : Factor w/ 1 level "bigdata/001.csv": 1

.....

dput(head(output)) 返回

    list(structure(list(filename = structure(1L, .Label = "bigdata/001.csv", class = "factor"), 
    sumrows = 142), .Names = c("filename", "sumrows"), row.names = c(NA, 
-1L), class = "data.frame"), structure(list(filename = structure(1L, .Label = "bigdata/001.csv", class = "factor"), 
    sumrows = 521), .Names = c("filename", "sumrows"
), row.names = c(NA, -1L), class = "data.frame"), structure(list(
    filename = structure(1L, .Label = "bigdata/001.csv", class = "factor"), 
    sumrows = 324), .Names = c("filename", "sumrows"), row.names = c(NA, 
-1L), class = "data.frame"), structure(list(filename = structure(1L, .Label = "bigdata/001.csv", class = "factor"), 
    sumrows = 1896), .Names = c("filename", "sumrows"
), row.names = c(NA, -1L), class = "data.frame"), structure(list(
    filename = structure(1L, .Label = "bigdata/001.csv", class = "factor"), 
    sumrows = 1608), .Names = c("filename", "sumrows"
), row.names = c(NA, -1L), class = "data.frame"), structure(list(
    filename = structure(1L, .Label = "bigdata/001.csv", class = "factor"), 
    sumrows = 912), .Names = c("filename", "sumrows"), row.names = c(NA, 
-1L), class = "data.frame"))

【问题讨论】:

  • 为了节省人们的时间,您能否编辑您的问题并在顶部解释您所说的尝试添加两个数据框时是什么意思。我假设您不是在谈论df1 + df2...事实上,您为什么不给我们一个可重复的示例,其中包含两个小的 data.frames 和您的预期输出?您的很多代码似乎与问题无关。
  • 我现在试图澄清我的问题。
  • @DanielLabbé 什么是文件名[]?我的意思是为什么 []
  • 请输入您的代码reproducible。我们应该能够将您的代码复制到 R 会话中以执行它。你的问题的答案可能会涉及到?do.call
  • @agstudy。抱歉,我的意思是 filename[i] 其中 i 是矢量文件名的索引。

标签: r merge dataframe apply


【解决方案1】:

将列表更改为 data.frame 的一般技术是使用do.call

ll <- list(c(filename=1 ,result=142 ),c(filename=2 ,result=521 ))
> do.call(rbind,ll)
     filename result
[1,]        1    142
[2,]        2    521

当我将此应用于您的列表时,我得到:

do.call(rbind,ll)
         filename sumrows
1 bigdata/001.csv     142
2 bigdata/001.csv     521
3 bigdata/001.csv     324
4 bigdata/001.csv    1896
5 bigdata/001.csv    1608
6 bigdata/001.csv     912

很遗憾,您没有准确说明什么是文件名[i]?

编辑

此解决方案似乎适用于 OP:

library(plyr)
ldply(ll)

一般你可以使用:

ldply(ll,function(x){
           ##you process the row x here
  }
 )

【讨论】:

  • 问题在于我需要将两个数据帧强制转换为向量。很抱歉没有说清楚。
  • 你能不能至少加上str(output)dput(head(output))的输出?
  • 完成。如果还有其他事情,请告诉我。
  • @DanielLabbé 我将编辑您的问题以使其更简单。
  • @DanielLabbé 你能解释一下什么是文件名[i]?并添加我想念的东西..?
猜你喜欢
  • 2014-04-14
  • 2017-01-15
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多