2017-02-20 5 views
0

これを理解する方法はわかりません。ここで要因変数を別の行と比較して1行上に移動

は、サンプルデータセットである:

Bob <- sample("Bob", 6, replace = T) 
Jeff <- sample("Jeff", 6, replace = T) 
Carl <- sample("Carl", 6, replace = T) 
Name <- array(c(Bob, Jeff, Carl), dim = c(18,1)) 
Week <- c("Week 1", "Week 2", "Week 3", "Week 4", "Week 5", "Week 6", 
     "Week 1", "Week 2", "Week 3", "Week 4", "Week 5", "Week 6", 
     "Week 1", "Week 2", "Week 3", "Week 4", "Week 5", "Week 6") 

variable.1 <- c("No", "No", "No", "Yes", "No", "No", 
      "Yes", "No", "No", "No", "Yes", "No", 
      "No", "Yes", "No", "No", "No", "Yes") 

df <- data.frame(Name, Week, variable.1) 
df 

    Name Week variable.1 
1 Bob Week 1   No 
2 Bob Week 2   No 
3 Bob Week 3   No 
4 Bob Week 4  Yes 
5 Bob Week 5   No 
6 Bob Week 6   No 
7 Jeff Week 1  Yes 
8 Jeff Week 2   No 
9 Jeff Week 3   No 
10 Jeff Week 4   No 
11 Jeff Week 5  Yes 
12 Jeff Week 6   No 
13 Carl Week 1   No 
14 Carl Week 2  Yes 
15 Carl Week 3   No 
16 Carl Week 4   No 
17 Carl Week 5   No 
18 Carl Week 6  Yes 

私がやろうとしていますそれは何のための因子変数として反映させることができるように、任意の「はい」variable.1列まで行に移動しています前週の情報私は個人によってこれをやろうとしています(データ全体ではありません)。私は両方の変数が要因である場合、これについて最善の方法を理解できません。理想的には、NAを表示したい。私はすべてが単に上に移動することを望んでいない。私は、「はい」となっていた場所にNAを表示し、その上に「いいえ」を上書きしておきたいだけです。

Name Week variable.1 New.Col 
1 Bob Week 1   No  No 
2 Bob Week 2   No  No 
3 Bob Week 3   No  Yes 
4 Bob Week 4  Yes  NA 
5 Bob Week 5   No  No 
6 Bob Week 6   No  No 
7 Jeff Week 1  Yes  NA 
8 Jeff Week 2   No  No 
9 Jeff Week 3   No  No 
10 Jeff Week 4   No  Yes 
11 Jeff Week 5  Yes  NA 
12 Jeff Week 6   No  No 
13 Carl Week 1   No  Yes 
14 Carl Week 2  Yes  NA 
15 Carl Week 3   No  No 
16 Carl Week 4   No  No 
17 Carl Week 5   No  Yes 
18 Carl Week 6  Yes  NA 
+0

何作ることによってレベルとしてNAを除くことができますあなたは(Jeff、Week 1、Yes)のような状況で起こりたいですか? –

+0

ああ、良い質問です。ごめんなさい。私の投稿を更新します。理想的には、NAを表示したい。私はすべてが単に上に移動することを望んでいない。私は、「はい」となっていた場所にNAを表示し、その上に「いいえ」を上書きしておきたいだけです。 – user3585829

+1

私はまだ少し混乱しています。この例の新しい列をどのようにしたいのですか? –

答えて

1

だが、これを試してみましょう:完成した製品は、以下の「New.Col」のようなトイレが好き

だから、私は、理想的には思います。

データの一部が不正確になった場合に備えて、名前と週別にdfを並べ替えます。 (これは欠けている週については説明しません)variable.1のコピーをnewcolの文字で再生します。

df <- df[order(df$Name, df$Week),] 
df$newcol <- as.character(df$variable.1) 

わかりやすくするために、私はループを書くつもりですが、計算にはより良い方法があります。このループは、ループ内でDF $名にそれぞれユニークな人物で

for (person in unique(df$Name)) { 

} 

を見ていきます、私は一人一人のためにnewcol内のすべてのエントリを選択します。

oldvalues <- df[df$Name == person, ]$newcol 

次に、各値を1エントリ上に移動し、最後のエントリをNAにします。

newvalues <- c(oldvalues[2:length(oldvalues)], NA) 

また、その週をNAにすることで古い値が「はい」となるたびにアカウントを作成したいと考えています。

newvalues[oldvalues == "Yes"] <- NA 

次に、dfに戻すことができます。

df[df$Name == person,]$newcol <- newvalues 

ループが終了したことを今、あなたが戻っ要因にdf$newcolいずれかのデフォルト

df$newcol <- factor(df$newcol) 

または第三の要因レベル

df$newcol <- factor(df$newcol, exclude = NULL) 
+0

ありがとう。それはうまくいかないようです。私がこのループを実行すると、このエラーが発生します: '[.data.frame'(df、df $ Name == person、df $ newcol)のエラー:未定義の列が選択されました – user3585829

+0

お詫び申し上げます。私は2つのタイプミスを修正しました。 –

+0

優れています。あなたよりもずっと! – user3585829

関連する問題