4

Rの専門家にとって間違いなく簡単に解決できる質問。

順番にラベル付けされたデータフレームでいくつかの関数を繰り返す必要があります(それらをすべてマージする前に)。たとえば、次のことを行う必要があるかもしれません。

# READ IN DATAFILES & LABEL DF'S 
df1 <- read.csv(file="file_A.csv",head=TRUE) 
df2 <- read.csv(file="file_B.csv",head=TRUE) 
df3 <- read.csv(file="file_C.csv",head=TRUE)

# TURN DF'S INTO DATA TABLES
df1<-data.table(df1)
df2<-data.table(df2)
df3<-data.table(df3)

# CHANGE VARIABLE TO POSIX
df1$date <-as.POSIXct(df1$date, format = "%Y-%m-%d %H:%M:%S")
df2$date <-as.POSIXct(df2$date, format = "%Y-%m-%d %H:%M:%S")
df3$date <-as.POSIXct(df3$date, format = "%Y-%m-%d %H:%M:%S")

# FILTER BY DATE RANGE
date_filter<-as.POSIXct("2012-01-01 01:01:01")
df1<-subset(df1, df1$date>date_filter)
df2<-subset(df2, df2$date>date_filter)
df3<-subset(df3, df3$date>date_filter)

# AGGREGATE OVER A UNIQUE ID 
df1<-df1[,(sum(var)), by=list(id)] 
df2<-df2[,(sum(var)), by=list(id)] 
df2<-df2[,(sum(var)), by=list(id)] 

# FINALLY, MERGE TOGETHER
df <-merge(df1,df2, by="id",all=TRUE)

df_nums<-c(1:25)あなたはその考えを理解します-3ではなく25のデータフレームに対してこれを行う必要があるだけですベクトル( ))を作成し、関数を使用してすべてのデータフレームをループすることでRリピート関数を作成できるのではないかと疑っています、しかし私はそれを行う方法がわかりません。

助けてください!ありがとう!

編集: Arunのおかげで、私は実際のコードについてこれまでです:

out<- lapply(1:length(files), function(idx) {
  df <- as.data.table(read.csv(files[idx], header = TRUE))
  df$date <- as.POSIXct(df$date, format = "%Y-%m-%d %H:%M:%S")
  date_filter <- as.POSIXct("2012-11-13 01:01:01")
  df <- subset(df, df$date > date_filter)
  df <- df[, .N, by = list(id)] 
})
out<-data.table(out)
out.merge <- Reduce(function(...) merge(..., by="id", all=T), out)

編集2: 次の構文を実行した後、 たとえば、にdata.tablesネストされているように見えますout.

> head(out)
            out
1: <data.table>
2: <data.table>
3: <data.table>
4: <data.table>
5: <data.table>
6: <data.table>

これらにアクセスdata.tablesして、すべてが正しく機能したかどうかを確認するにはどうすればよいですか?

4

1 に答える 1

6

list.files次のように、ディレクトリからすべての CSV ファイルを取得し、lapply再帰的に使用できます。

# Thanks Matthew for correcting the pattern string
files <- list.files("path_to_files", full.names = TRUE, pattern="\\.csv$") 
out <- lapply(1:length(files), function(idx) {
    df <- as.data.table(read.csv(files[idx], header = TRUE))
    df$date <- as.POSIXct(df$date, format = "%Y-%m-%d %H:%M:%S")
    date_filter <- as.POSIXct("2012-01-01 01:01:01")
    df <- subset(df, df$date > date_filter)
    df <-df[, (sum(var)), by = list(id)]
})

do.call(rbind, out)またはを使用do.call(cbind, out)して、すべての結果を行または列でバインドできます。

編集:外部結合に関する@roodyの質問の後。このようなもの?

out.merge <- Reduce(function(...) merge(..., by="id", all=T), out)
于 2013-01-21T15:47:01.447 に答える