0

同じ関数を適用したいデータフレームが多数あります。

コンテキスト: 被験者のタイム ウィンドウを記録するデータ フレームがあり、0/1 のインジケーターがあり、そのタイム ウィンドウで偶数が発生したかどうかを示します。例:

ID start stop event
1  0     12   0
1  12    24   0 
1  24    36   1
1  36    48   1
2  0     12   0 

私が持っているのは、各 ID の最初のイベントの後のすべてのエントリを削除する関数です。たとえば、上記の例では ID = 1、開始時間 = 36 のレコードです。

1 つのデータセットのコードは次のとおりです: (データセットは event1 と呼ばれ、IDT は ID です)

list1 <- which(event1$event == 1)

while(length(list1) >= 1){

  id <- event1[ list1[ 1 ] , ]$IDT
  idplus1 <- event1[ ( list1[1] + 1) , ]$IDT
  b <- which( event1$IDT == id )

  if( id == idplus1 ){ 

     event1 <- event1[- ( ( list1[1] + 1 ) : b[ length(b) ] ) , ]   
   }

 list1 <- list1[-1]  

}

ここで、4 つのデータセットがあるとします。event1、event2、event3、event4 のそれぞれにこの関数を適用したいのですが、これを行う関数を定義する方法はありますか? ここでラップリーを使用する機会があるべきだと思います...

4

5 に答える 5

1

複数のデータ フレームをループして、それらすべてに対して同じ一連のコマンドを実行する方法の例を次に示します。

# list containing multiple data frames
x <- list( mtcars , iris )

# some function you've defined
myfun <-
    function( df ){

        # find numeric variables
        nv <- sapply( df , is.numeric )

        # return the 10th and 90th percentile of each numeric column
        sapply( df[ , nv ] , quantile , c( 0.1 , 0.9 ) )

    }

# run the function across all data frames
lapply( x , myfun )
于 2013-04-03T15:52:40.423 に答える
1

関数が呼び出されmyfuncた場合、それをオブジェクトに適用するにevent1は、event4使用できます

lapply(paste0('event',1:4), function(x)  { eventDF <- get(x) ; myfunc(eventDF)   })

説明:

paste0('event',1:4)関数を適用するオブジェクト名の文字ベクトルを作成します。

lapply上記の文字ベクトルの各要素にインライン関数を適用します。

get(x)と等しい名前のオブジェクトを返しますx

于 2013-04-03T15:50:36.730 に答える
1

これが私があなたの問題に取り組む方法です:

データセットの作成 (データフレームのリスト)

dat1 <- read.table(text="ID start stop event
1  0     12   0
1  12    24   0 
1  24    36   1
1  36    48   1
2  12    24   0 
2  24    36   1
2  36    48   1
3  0     12   0", header=TRUE)

dat2 <- dat3 <- dat1
dats <- list(dat1, dat2, dat3)

関数をデータフレームのリストに適用する

#Function to select up to first 1
FUN <- function(x) {
    splitx <- split(x, x$ID)
    out <- do.call(rbind, lapply(splitx, function(x) {
        inds <- c(which(x$event == 0), which(x$event == 1)[1])
        na.omit(x[inds, ])
    }))
    data.frame(out, row.names=NULL)
}

#apply it to all in list
lapply(dats, FUN)
于 2013-04-03T15:55:55.870 に答える
0

サンプルコードをクリーンアップすることから始めます。これは、サンプルコードをエラーなしで実行できなかったためです。ある変数の値ごとに (この場合は「ID ごとに」) 何かを行っているときはいつでも、分割 - 適用 - 結合の問題を見ていることになります。このような問題に対して私が好むツールはplyrパッケージですが、それだけではありません。手順を次のように書き直します。

library("plyr")
ddply(event1, .(ID), function(DF) {
  firstevent <- which(DF$event == 1)[1]
  DF[seq(length=firstevent),]
})

これは を取りevent1、それを の一意の値で分割しID、それぞれについて、最初のイベントまでのレコードのみを保持します。

これは簡単に関数にラップできます。

truncevent <- function(event1) {
  ddply(event1, .(ID), function(DF) {
    firstevent <- which(DF$event == 1)[1]
    DF[seq(length=firstevent),]
  })
}

展開されたevent1:

event1 <- read.table(text=
"ID start stop event
1  0     12   0
1  12    24   0 
1  24    36   1
1  36    48   1
2  0     12   0
2  12    24   1
2  24    36   1", header=TRUE)

我々が得る

> truncevent(event1)
  ID start stop event
1  1     0   12     0
2  1    12   24     0
3  1    24   36     1
4  2     0   12     0
5  2    12   24     1

これで、複数のデータセットの反復処理に関する質問の部分に取り掛かります。1 つのアプローチは、データ セット名のベクトルを作成し、それを反復処理して、これらのそれぞれに対して関数を実行することです。

events <- c("event1", "event2", "event3", "event4")
lapply(events, function(event) {
  truncevent(get(event))
})

それぞれの名前を個別に追跡するよりも、イベント自体をリストに入れる方がより自然です。次に、このリストの繰り返しはさらに簡単です。

events <- list(event1, event2, event3, event4)
lapply(events, truncevent)

これらのアプローチは両方とも、変換されたバージョンである data.frames のリストを返します。

于 2013-04-03T15:59:01.810 に答える