2016-12-01 10 views
0

データを次のように変換するために使用する適切な関数を見つけるのに苦労しています。私は自分の検索に使う正しいクエリーについて本当にわからないので、これには非常に明白な解決策がある場合はお詫びします。これはワイドフォーマットからロングフォーマットへの変換ではありませんが、やや似ていますが、私は溶融または変換を使って解決策を見つけることができませんでした。データ変換 - 古い行に基づく複数の行

$name $total $numcorrect 
-------------------------- 
bob 2  2 
bob 1  0 
mary 4  3 
... 

がソートで

$name $n  $correct 
------------------------- 
bob 1  TRUE 
bob 2  TRUE 
bob 3  FALSE 
mary 1  TRUE 
mary 2  TRUE 
mary 3  TRUE 
mary 4  FALSE 

なり、各$名のために、私は二項の形に合計のうち、正しい番号を変換したいです。例えば。 Bobの最初の行については、2つの新しい行がTRUE、Bobの2番目の行でFALSEの行が1つ必要です。

+0

私は 'bob'のすべての行に対して' total == numcorrect'が書かれているので、なぜ 'bob 3'が' FALSE'なのか分かりません。最初のデータフレームをどのように2番目のデータフレームに変換するかについて、より具体的に説明できますか? – Barker

+0

おっと、スーパーバーカー!私はこれを修正するためにメインのデータフレームを調整しました。質問自体にさらに情報を追加します。 – pomegranate

+0

これは常に最後のものが 'FALSE'であると仮定すべきでしょうか? 'bob 1 0'が2番目の行ではなく最初の行であれば、結果は同じに見えますか? – Barker

答えて

0
# try this 
df <- data.frame(
    name = c('bob', 'bob', 'mary'), 
    total = c(2, 1, 4), 
    numcorrect = c(2, 0, 3), 
    stringsAsFactors = F 
)  

df.new <- data.frame(
    name = rep(df$name, df$total), 
    correct = rep(rep(c(T, F), nrow(df)), c(rbind(df$numcorrect, df$total - df$numcorrect))), 
    stringsAsFactors = F 
) 
# > df.new 
# name correct 
# 1 bob TRUE 
# 2 bob TRUE 
# 3 bob FALSE 
# 4 mary TRUE 
# 5 mary TRUE 
# 6 mary TRUE 
# 7 mary FALSE 

# if bob 1 0 was the first row: 
df <- data.frame(
    name = c('bob', 'bob', 'mary'), 
    total = c(1, 2, 4), 
    numcorrect = c(0, 2, 3), 
    stringsAsFactors = F 
) 

df.new <- data.frame(
    name = rep(df$name, df$total), 
    correct = rep(rep(c(T, F), nrow(df)), c(rbind(df$numcorrect, df$total - df$numcorrect))), 
    stringsAsFactors = F 
) 
# > df.new 
# name correct 
# 1 bob FALSE 
# 2 bob TRUE 
# 3 bob TRUE 
# 4 mary TRUE 
# 5 mary TRUE 
# 6 mary TRUE 
# 7 mary FALSE 
+0

ご協力いただきありがとうございます!正しい= rep ...行がどのように機能しているかを私に説明してもらえますか?私はそれを理解することを確認したい。 – pomegranate

+0

@pomegranate、それは基本的にT、Fを対応する正しい時刻で繰り返し、行によって正しいものではない。私は今とても忙しいです。あなたはそれぞれのステップの結果を印刷して理解することができます。 – mt1022

1

合計の列を正しく追加してから、cbindで繰り返し適用することもできます。

df$inc=df$tot-df$cor 
data.frame(do.call(rbind, apply(df, 1, function(x) cbind(name=rep(x[1],x[2]),n=1:x[2],correct=c(rep(TRUE,x[3]), rep(FALSE,x[4])))))) 
    name n correct 
1 bob 1 TRUE 
2 bob 2 TRUE 
3 bob 1 FALSE 
4 mary 1 TRUE 
5 mary 2 TRUE 
6 mary 3 TRUE 
7 mary 4 FALSE 
関連する問題