4

との組み合わせごとに、データセットから最初のレコードを抽出しようとしていSUBJます。簡略化されたセットsampleDataは次のとおりです。BLKTR

SUBJ BLK TR    BEG    END
1  1234   1  1 111021 111021
2  1234   1  1 111400 111021
3  1234   1  1 111566 111021
4  1234   1  1 111765 111021
5  1234   2  2 132050 133113
6  1234   2  2 133123 133113
7  1234   2  2 133479 133113
8  1234   2  2 133762 133113
9  5678   1  1  82503  82502
10 5678   1  1  82902  82502
11 5678   1  1  83102  82502
12 5678   1  1  83310  82502
13 5678   2  2 274870 288224
14 5678   2  2 288225 288224
15 5678   2  2 288535 288224
16 5678   2  2 288802 288224

私がこれを試すとき:

ddplyFirst <- ddply(sampleData, .(SUBJ, BLK, TR), summarize, 
                        Tr.match = match(unique(TR), TR))

私はこれを手に入れます:

ddplyFirst
  SUBJ BLK TR Tr.match
1 1234   1  1        1
2 1234   2  2        1
3 5678   1  1        1
4 5678   2  2        1

これから取得したいものに移動する方法がわかりません。これには、BEGandEND値または。が含まれますBEG - END

さて、上記の例でENDは、は一意の番号であることがわかったので、これを行うことができます。

first <- with(sampleData, match(unique(END), END))

それは私に与えます:

sampleData[first,]
   SUBJ BLK TR    BEG    END
1  1234   1  1 111021 111021
5  1234   2  2 132050 133113
9  5678   1  1  82503  82502
13 5678   2  2 274870 288224

問題は、完全なデータセットが202,616レコードの長さであり、、、、およびのさまざまな組み合わせに対して一意の値を保証できないことBEGです。ENDSUBJBLKTR

また、より一般的なケースを解決する方法を学びたいと思います。これは、今のところ、、、、および組み合わせのそれぞれSUBJで最初のレコードを取得することです。BLKTR

もちろん、さらに一般的なケースは、、、、およびコンボのそれぞれでn番目のレコードを取得することです。誰かがこれらの「より」一般的または「最も」一般的な解決策のいずれかを行う方法を私に示すことができれば、私は非常に感謝するでしょう。SUBJBLKTR

4

5 に答える 5

3

summariseここで使用する必要はありません。これを行うことができます (head最初の行を取得するために使用します)。

 ddply(sampleData, .(SUBJ, BLK, TR), function(x) head(x,1))
  SUBJ BLK TR    BEG    END
1 1234   1  1 111021 111021
2 1234   2  2 132050 133113
3 5678   1  1  82503  82502
4 5678   2  2 274870 288224

または、より一般的に n 番目の行を取得することができます。

ddply(sampleData, .(SUBJ, BLK, TR), function(x) x[min(row.n,nrow(x),])
于 2013-02-23T16:27:48.210 に答える
2

そのようにインデックスを作成するだけで、1番目またはn番目のレコードにアクセスできます(nth各グループにインデックスが存在すると仮定します):

idx <- 2
ddply(sampleData, .(SUBJ, BLK, TR), summarise, BEG=BEG[idx], END=END[idx])

#   SUBJ BLK TR    BEG    END
# 1 1234   1  1 111400 111021
# 2 1234   2  2 133123 133113
# 3 5678   1  1  82902  82502
# 4 5678   2  2 288225 288224
于 2013-02-23T16:23:28.493 に答える
1

data.tableエレガンス(および一般的な効率)をコーディングするためのソリューション

最初の行以外の行を取得している場合(および各サブグループに異なる数の行がある場合)、存在しない行を取得しようとするとどうなるかを考慮する必要があります。

以下のソリューションはmin(`n`, `total#of rows in each group`))、各グループのを取得します

library(data.table)
DT <- data.table(sampleData)

# get the the row you want. This may 
#
index <- 2L
 DT[,{ idx <- min(index, .N); .SD[idx,]} ,by =list(SUBJ, BLK, TR)] 
于 2013-02-24T22:57:31.293 に答える
0

aggregate一般的なケースの解決策は次のとおりです。

aggregate(. ~ SUBJ+BLK+TR, data=sampleData, FUN='[', 1)
##   SUBJ BLK TR    BEG    END
## 1 1234   1  1 111021 111021
## 2 5678   1  1  82503  82502
## 3 1234   2  2 132050 133113
## 4 5678   2  2 274870 288224


aggregate(. ~ SUBJ+BLK+TR, data=sampleData, FUN='[', 2)
##   SUBJ BLK TR    BEG    END
## 1 1234   1  1 111400 111021
## 2 5678   1  1  82902  82502
## 3 1234   2  2 133123 133113
## 4 5678   2  2 288225 288224
于 2013-02-23T16:46:10.997 に答える
0

特定のケース (最初または最後の行を取得する) では、次の関数を使用できますduplicated

sampleData[!duplicated(sampleData[,c("SUBJ","BLK","TR")],fromLast=FALSE),]
于 2013-02-23T16:52:42.397 に答える