2016-09-15 5 views
0

私は、元の変数に課せられた条件に基づいて新しい変数を作成したいと思います。新しい変数「newvarが」とき、元の「欠落するように設定されているのは、元の変数、「VAR」新しい変数を作成するときに何が問題になりましたか?

  • を言ってみましょう、1からランダムなサンプルで構成ベクトルである... 20、および
  • varが 『警告メッセージは、結果を示し、以下のように10未満

コードが

> mydata <- data.frame(var=sample(1:20)) 
> mydata$newvar <- rep(NA, nrow(mydata)) 
> mydata$newvar[mydata$var < 10] <- mydata$var 
Warning message: 
In mydata$newvar[mydata$var < 10] <- mydata$var : 
    number of items to replace is not a multiple of replacement length 

、手順を記述している『と、』VARはVAR」に10より大きい、及び等しいです』ひどいです。例えば、行4及び5において、「newvar」は、それぞれ、行2及び3に、「VAR」の値を割り当てられています。何がうまくいかなかったのか教えていただけますか?

> mydata 
    var newvar 
1 3  3 
2 16  NA 
3 13  NA 
4 5  16 
5 7  13 
6 19  NA 
7 4  5 
8 17  NA 
9 9  7 
10 20  NA 
11 14  NA 
12 8  19 
13 10  NA 
14 6  4 
15 1  17 
16 11  NA 
17 18  NA 
18 15  NA 
19 2  9 
20 12  NA 

私は比較的新しいRですが、変数やデータの操作方法はまだ学習しています。新しい変数を作成するには、私は私が

mydata$newvar <- rep(NA, nrow(mydata)) 
loop_through_these <- which(mydata$var < 10) 

for(i in loop_through_these){ 

    mydata$newvar[i] <- mydata$var[i] 
} 
> mydata 
    var newvar 
1 3  3 
2 16  NA 
3 13  NA 
4 5  5 
5 7  7 
6 19  NA 
7 4  4 
8 17  NA 
9 9  9 
10 20  NA 
11 14  NA 
12 8  8 
13 10  NA 
14 6  6 
15 1  1 
16 11  NA 
17 18  NA 
18 15  NA 
19 2  2 
20 12  NA 

これ以下のように変更する必要がインデックスを通じてだけでループができることを理解し、最も効率的ではないが、私に正しい結果を与えます。それでも、ループを使うよりも効率的な方法があると思います。あなたの助けに感謝します。

+0

それは完全に、感謝を働きました! – TCL

答えて

1

だけmydata$newvar <- with(mydata, ifelse(var < 10, var, NA))を使用しています。

あなたも、あなたが得た警告メッセージについては言及しませんでした。正しい方法は次のとおりです。

mydata$newvar[mydata$var < 10] <- mydata$var[mydata$var < 10] 

これ以外の場合は、長さが一致しません。

1

あなたはifelseまたはwhichのいずれかを使用してこれを行うことができます。 ifelseを使用すると、NA初の列を作成する必要はありません。

mydata$newvar <- ifelse(mydata$var < 10, mydata$var, NA) 

すでにNA秒の列を作成した場合、これは動作します:

mydata$newvar[which(mydata$var < 10)] <- mydata$var[which(mydata$var < 10)] 
+2

'()'は必要ありません。 – RHertel

+0

良い点@RHertel。 OPがやったとドキュメントが参考になるかもしれないと思ったので、私はそれを使用していますが、それはZheyuan李の答えが示すように、このなしで動作することですね。 – Matt

関連する問題