4

これは簡単な答えでなければなりません。テスト目的でデータをサブセット化したい。情報のすべての列を保持したいデータフレームがありますが、単に個人ごとの観測数を減らすだけです。したがって、私は一意の識別子と約 50 人の個人を持っています。2 人の個人のみを選択し、その 2 人から 500 のデータ ポイントのみを選択したいと考えています。

私のデータフレームはwloc08. 固有 ID は 50 あります。私はそれらの個人のうち2人だけを取っていますが、それらの2人のうち、それぞれから500個のデータポイントだけが欲しいです.

subwloc08=subset(wloc08, subset = ID %in% c("F07001","F07005"))

このステートメントのどこかで使用できます[か?

 reduced= subwloc08$ID[1:500,]

うまくいきません。

4

2 に答える 2

6

2 人の個人のみを扱っている場合は、それぞれを個別にサブセット化してから、rbind各サブセットを ing することで回避できます。

wloc08F07001 <- wloc08[which(wloc08$ID == "F07001")[1:500], ]

wloc08F07005 <- wloc08[which(wloc08$ID == "F07005")[1:500], ]

reduced <- rbind(wloc08F07001, wloc08F07005)

これをより一般化できるようにするために、特に大量のデータを扱っている場合は、data.tableパッケージを検討することを検討してください。ここに例があります

library(data.table)

wloc08DT<-as.data.table(wloc08)  # Create data.table

setkey(wloc08DT, "ID")           # Set a key to subset on

# EDIT: A comment from Matthew Dowle pointed out that by = "ID" isn't necessary
# reduced <- wloc08DT[c("F07001", "F07005"), .SD[1:500], by = "ID"]
reduced <- wloc08DT[c("F07001", "F07005"), .SD[1:500]]

最後のステップの構文を分解するには:

  1. c("F07001", "F07005")F07001: これは、キーがまたはに等しいすべての行を見つけることによって、データをサブセット化しますF07005。また、「by without by」を扇動します (詳細については、を参照?data.tableしてください) 。

  2. .SD[1:500]:.SD行 1:500 を選択して、オブジェクト (サブセット化された data.table) をサブセット化します。

  3. EDITこの部分は Matthew Dowle による修正のおかげで削除されました。「by without by」は、ステップ 1 によって開始されます。以前: ( by = "ID": これは[.data.table、ステップ 2 の操作を ID ごとに個別に実行することを示します。この場合、ステップ 1 で指定した ID のみです。)

于 2012-09-18T09:32:58.977 に答える
3

使用できますlapply

do.call("rbind",
        lapply(c("F07001", "F07005"),
               function(x) wloc08[which(wloc08$ID == x)[1:500], ]))

はベクトルであるため、コマンドreduced = subwloc08$ID[1:500,]は機能しませんでした。subwloc08$IDただし、機能しましたが、 ( の行全体ではなく)reduced = subwloc08$ID[1:500]の最初の 500 個の値が返されました。subwloc08$IDsubwloc08

unique(wloc08$ID)[1:30]最初の 30 件の被験者に対してこのコマンドを実行する場合は、代わりに次のコマンドを使用できますc("F07001", "F07005")

do.call("rbind",
        lapply(unique(wloc08$ID)[1:30],
               function(x) wloc08[which(wloc08$ID == x)[1:500], ]))
于 2012-09-18T09:21:11.053 に答える