2017-08-19 6 views
2

この投稿(R: How to split a data frame into training, validation, and test sets?)に示されているように、訓練、検証、テストセットにデータセットをランダムに分割する必要がありますが、データフレーム全体ではなく、分割対象IDにランダムにリンクする必要があります。IDに依存するトレーニング、検証、およびテストセットにデータフレームを分割する方法は?

この質問に回答したコードを適用すると、私のデータフレームは完全にランダムに分割されますが、私はIDを積み重ねて一緒にいなければなりません。

ご迷惑をおかけして申し訳ありません。ここに私のデータは、問題を説明するために:

df <- c(Contact.ID, Date.Time, Age, Gender, Attendance) 

Contact.ID  Date.Time  Age Gender Attendance 
1 A  2012-07-06 18:54:48 37 Male   30  
2 A  2012-07-06 20:50:18 37 Male   30  
3 A  2012-08-14 20:18:44 37 Male   30 
4 B  2012-03-15 16:58:15 27 Female   40  
5 B  2012-04-18 10:57:02 27 Female   40  
6 B  2012-04-18 17:31:22 27 Female   40  
7 B  2012-04-18 18:37:00 27 Female   40  
8 C  2013-10-22 17:46:07 40 Male   5  
9 C  2013-10-27 11:21:00 40 Male   5  
10 D  2012-07-28 14:48:33 20 Female   12 

私はランダムにこのデータを分割した場合は、対象Aのエントリは、例えば、私の検証セットで私のテストセットで2と1を持つことができます。しかし、データフレーム全体をランダムに分割するのではなく、異なるIDをランダムに分割する必要があり、これらをどのように接続するのか分かりません。

答えて

2

もしthe previous train/validate/test questionから通知コードは電車を割り当て、検証、またはテストラベルデータフレームの各行および各列のラベルに基づいて分割:

代わり
spec = c(train = .6, test = .2, validate = .2) 
g = sample(cut(
    seq(nrow(df)), 
    nrow(df)*cumsum(c(0,spec)), 
    labels = names(spec) 
)) 
res = split(df, g) 

、あなたは割り当てることができこれは、分割比率の解釈を変更することを

set.seed(144) 
spec = c(train = .6, test = .2, validate = .2) 
g = sample(cut(
    seq_along(unique(df$Contact.ID)), 
    length(unique(df$Contact.ID))*cumsum(c(0,spec)), 
    labels = names(spec) 
)) 
(res = split(df, g[as.factor(df$Contact.ID)])) 
# $train 
# Contact.ID   Date.Time Age Gender Attendance 
# 1   A 2012-07-0618:54:48 37 Male   30 
# 2   A 2012-07-0620:50:18 37 Male   30 
# 3   A 2012-08-1420:18:44 37 Male   30 
# 8   C 2013-10-2217:46:07 40 Male   5 
# 9   C 2013-10-2711:21:00 40 Male   5 
# 
# $test 
# Contact.ID   Date.Time Age Gender Attendance 
# 4   B 2012-03-1516:58:15 27 Female   40 
# 5   B 2012-04-1810:57:02 27 Female   40 
# 6   B 2012-04-1817:31:22 27 Female   40 
# 7   B 2012-04-1818:37:00 27 Female   40 
# 
# $validate 
# Contact.ID   Date.Time Age Gender Attendance 
# 10   D 2012-07-2814:48:33 20 Female   12 

注:トレーニングセットに割り当てられた60%、各行のIDに割り当てられたラベルに基づいて自分のIDの因子変数と分割のそれぞれのユニークなレベルにラベルを付けますユニークな主題の60%ですIDであり、行の60%ではありません。

+0

ちょっと:) お返事ありがとうございます! 私はあなたのアプローチとそれがどのように機能すべきかを知っていますが、それは自分のデータでは機能しません。私は約13,000のIDを持っていますが、私はあなたのコードを実行すると 'spec 'に従って28万の観測を分割しますが、異なるセットはそれぞれ13,000のIDを持っているので、' spec'に従ってIDを分割しません。どのように私はこれを変更することができますか? – Fee

+0

こんにちは、私はそれを修正したと思います:私は私のIDの要因変数として使用していましたが、私は今数値に変更しようとしたと私はそれが働いたと思う。それが問題になったのは理にかなっていますか? – Fee

+0

@私がここに投稿したコードは、IDフィールドの任意のデータ型に対して機能するはずです。実際のデータを共有すると便利です。あなたのデータのために働くことに問題があるなら 'dput(head(df))'の出力。 – josliber

関連する問題