2016-05-25 5 views
1

私は不均衡な縦方向のデータを持っています(各参加者の訪問数は異なります)。私は、参加者ごとに中点訪問を抽出し、それをデータフレームに変換する必要があります。したがって、不均衡な縦方向のデータの中点訪問を選択

  1. 参加者の訪問数が奇数の場合は、1回の訪問になります。
  2. 参加者の偶数回の訪問がある場合、平均して2回の訪問となります。

I私が最初にそれが奇数か偶数のかどうかに応じて、中間点の訪問を抽出した後、参加者idの訪問回数をカウントするtable()を使うかもしれませんが。

#Here is simulated data: 
id <- c(rep(1,5),rep(2,4),rep(3,15),rep(4,8)) 
b <- c(rnorm(32,25,1)) 
c <- c(rnorm(32,30,1.5)) 

data <- cbind(id,b,c) 
count.id <- table(id) 

これを行うにはもっとエレガントな方法がありますか?

答えて

1

これは簡単な方法です。以下のよう

id <- c(rep(1,5),rep(2,4),rep(3,15),rep(4,8)) 
b <- c(1:5, 1:4, 1:15, 1:8) 
c <- b 
data <- cbind(id,b,c) 

:それは簡単にあなたが正しいことを確認するために作るために、このサンプルデータセットを試してみてください

> table(id) 
id 
1 2 3 4 
5 4 15 8 

正解はbcの両方に3, 2.5, 8, 4.5です。今

## a function to return relavant mid points 
mid <- function(id) { 
    x <- table(id); y <- c(0, cumsum(x)[-length(x)]) 
    fun <- function(x) switch(x%%2 + 1, c(x/2, x/2+1), (x+1)/2) 
    rep(y, 2 - x %% 2) + as.numeric(unlist(tapply(x, 1:length(x), FUN = fun))) 
    } 

## use na.action = na.pass if you want to retain missing values 
## use subset = mid(id), to process the subset involving mid points 
## formula methods of aggregate takes data frame 
aggregate(. ~ id, as.data.frame(data), FUN = mean, subset = mid(id), 
      na.action = na.pass) 

そして、あなたが得る:

id b c 
1 1 3.0 3.0 
2 2 2.5 2.5 
3 3 8.0 8.0 
4 4 4.5 4.5 
+0

私はそれを試してみましたが、中央値は中央の訪問を抽出しません。 – user24318

+0

また、データに欠損値があり、集計関数が機能しないことがあります。 – user24318

+0

はい、欠損値があることは問題ありません。 – user24318

関連する問題