2017-02-07 8 views
0

大文字と小文字の制御対象を持つ巨大なデータフレームがあります。一致する場合:制御は1:3です。私はケースIDを再サンプリングし、対応するコントロールを抽出しようとしています。同じ行/ idsをrで繰り返しサブセット化する方法

したがって、IDのベクトルがあり、IDを繰り返し使用できます。私はベクトルの各idのためのケースとコントロールのデータを抽出したいと思います。ケースと一致するコントロールは同じcase_numを持ちます。 %in%は常にデータから一意のIDを取ります。私はそれを行うためにllplyを使用しました。約2.5秒かかります。他の効率的な方法はありますか?

私は簡単な例と質問に私の解決策を含めています。

私の場合、1921年のidベクトルの長さは、関数は1921回コントロールを抽出する必要があります。時間を1秒でも減らすことができれば、実際には多くのプロセスが繰り返されますが、1000回繰り返されます。ありがとうございました!

test_data=  

data.frame(id=c(1,1,2,4,4,5,6),value=c('g','e','r','j','a','b','c')) 

test_data 
id value 
1 1  g 
2 1  e 
3 2  r 
4 4  j 
5 4  a 
6 5  b 
7 6  c 



id_vec= c(1,4,1,5) 

library(plyr) 
newdata.list=llply(id_vec, function(x) test_data[test_data$id==x,]) 

## or if we make our data a data.table then 
library(data.table) 
test_data= data.table(test_data) 

newdata.list=llply(id_vec, function(x) test_data[id==x]) 

library(dplyr) 
newdata.frame= bind_rows(newdata.list) ### making it a dataframe 
newdata.frame 
    id value 
1: 1  g 
2: 1  e 
3: 4  j 
4: 4  a 
5: 1  g 
6: 1  e 
7: 5  b 
+0

PLSがテキストとしてではなく、画像などのデータを掲示します。 'dput(your_data)'を使って結果をコピーして貼り付けてください。 – GGamba

+0

編集した後、コメントを取得した後にコードを追加しました。 –

+0

おそらく、plyr + dplyr + data.tableを混ぜないことが最も安全です。 Plyrは本質的にdplyrに置き換えられました。おそらくそれはそうではありません。 – Frank

答えて

0

まず各idのデータフレームのリストにあなたのデータフレームを分割:

split_data = split(test_data, test_data$id) 

私の推測では、一度だけ、あなたがここで停止し、個別に各idがあり、このリストで仕事ができるですが、。あなたが本当にid_vecで各繰り返しのためにデータのコピーが必要な場合は、単にリストのインデックスを使用します。

result = split_data[id_vec] 

最後にあなたは、単一のデータフレームに再結合されている場合、これは非常に無駄です。すべてのデータが本当に必要なときは、データ全体をコピーする必要があります。私が正しく理解していれば、ケース番号はデータ内で繰り返されますが、サンプルデータはユニークなidですので、あなたの例は悪いです。ここでの方法は、データフレームのコピーを作成せずにデータをリサンプリングするためのデータとid_vec両方で繰り返さid Sである:

## new example data 
test_data2 = data.frame(id=c(1, 1, 2, 3, 3, 4), value=c('g','e','r','j','a','b')) 
id_vec2 = c(3, 1, 2, 3, 4, 1) 

rows = lapply(id_vec2, FUN = function(x) which(test_data2$id == x))  
result = test_data2[unlist(rows), ] 
result 
#  id value 
# 4 3  j 
# 5 3  a 
# 1 1  g 
# 2 1  e 
# 3 2  r 
# 4.1 3  j 
# 5.1 3  a 
# 6 4  b 
# 1.1 1  g 
# 2.1 1  e 
+0

これは完全に正常に動作します。あなたは私の例が完璧ではないことは間違いありません。私はそれを編集します。どうもありがとうございました。 –

関連する問題