-4

data.frame構造の2つのデータフレームを取り除き、各data.frameの要素を抽出し、データフレームから抽出したデータを1つのdata.frameに結合しようとしています。これにより、2つの列をベクトルとして含むdata.frameが作成されます。以下の出力(太字でマーク)を参照してください。

問題:出力には、入力データフレームからのベクトルを含む単一のdata.frameではなく、複数のdata.frame要素が含まれています。

各データフレームは1つのベクトルを保持します。

[コメントに応じてEDIT^v。]

as()これまでのところ、私はさまざまな組み合わせを試しunlist()ましたが、役に立ちませんでした...

組み込みのR関数とベクトル化を使用してこの問題を解決しようとしています(使用せずplyrloopsループを使用して複数のdata.framesを1つのdata.frameにマージします。csvファイルから多くのデータフレームをマージします。Data.framesのリストをに再結合します。単一のデータフレーム

再現可能なコードエラーを再現できませんでしたが、コードが機能することを望んだ方法は次のとおりです。

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(output)は

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"))
4

1 に答える 1

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
  }
 )
于 2013-01-19T15:16:32.627 に答える