3

私はいくつかの csv ファイルをインポートしようとしてきました。関数「melt」を使用して、それらを R の単一のデータベースにマージします。すべてのファイルには「id」、「date.time」、および「tag」列があります。ただし、残りの列はファイルによって異なります。これは、1 つのファイルに含まれる数行の例です。

               date.time   tag 111015 111016 113949 113950
1 1 2012-10-11 00:00:00 14767      0      0      0      0
2 2 2012-10-11 01:00:00 14767      0      0      0      0
3 3 2012-10-11 02:00:00 14767      0      0      0      0
4 4 2012-10-11 03:00:00 14767      0      0      0      0
5 5 2012-10-11 04:00:00 14767      0      0      0      0
6 6 2012-10-11 05:00:00 14767      0      0      0      0

library(reshape2)

# Import files

files<-list.files()
data<-lapply(files,read.csv,header=TRUE,sep=",",check.names=FALSE)

このループを使用して各ファイルを溶かし、結果のデータ フレームをバインドしようとしています。ただし、ループ内の最後のファイルに対してのみ機能します。最初に各ファイルの「溶解」を実行し、それらを単一のデータフレームに「マージ/バインド」できるようにループ/関数を設定する方法が正確にはわかりません。

for(j in 1:length(data)){
   dm<-melt(data[[j]],measure.vars=c(4:length(data[[j]])),
     id=c("date.time","tag"),variable.name="receiver")

   results<-rbind(dm)   

  }

どんな提案でも大歓迎です!

4

1 に答える 1

4

lapply最初にすべてをロードしてから、次のように使用することをmeltお勧めします: (すべてのファイルが変数にあると仮定するとfiles

Note: Untested 
require(reshape2)
files <- list.files(my.dir, full.names = TRUE)
# first load all files
dd <- lapply(1:length(files), function(idx) {
    d <-read.csv(files[idx], header = TRUE, sep=",", check.names = FALSE)
    # if you want the file index
    d$file.idx <- idx
    d
})
# merge all
dd <- do.call(rbind, dd)
# now melt
dd.m <- melt(dd, c(4:length(d)), c("date.time","tag"), variable.name = "receiver")

編集:Opの編集後

Note: Untested 
require(reshape2)
files <- list.files(my.dir, full.names = TRUE)
dd.m <- lapply(1:length(files), function(idx) {
    # load the file
    d <-read.csv(files[idx], header = TRUE, sep=",", check.names = FALSE)
    # now melt immediately
    d.m <- melt(d, c("date.time","tag"), c(4:length(d)))
})
# merge all
dd.m <- do.call(rbind, dd.m)
于 2012-12-27T02:23:18.613 に答える