2016-08-24 7 views
1

2つのダミー変数を作成したい:a) x1のすべての負の変更をキャプチャするもの。負の変化== 1がある場合、そうでない場合は== 0。すべて-1(以上)変更を取得負の値をダミー変数に変換する方法は?

そしてB)。例えば:10.5〜9.5または10〜9(または10〜6)。これもまたダミーとして扱われます。-1以上の場合は== 1、それ以外の場合は== 0となります。

正弦波のデータはこのように見えますが、変数は各personIDの負の値をキャプチャする必要があります。

personid year x1 
    33  1990 0 
    33  1991 3.5 
    33  1992 2.75 
    33  1993 3.25 
    33  1994 6 
    34  1990 17 
    34  1991 9 
    34  1992 16.5 
    34  1993 16.75 

次のコードを使用してください。

set.seed(100) 
mydata <- data.frame(
    x1 = sample(c(0:30, 1.5,5.75,9.25,10.25,11.75), 100, replace = TRUE), 
    personID = rep(c(1:10), each = 10) 
) 

私はそれがあまり役立ちません... aveを使用して、これらの変数を生成しようとしました。

dput(data) 
structure(list(personid = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 20L, 20L, 20L, 20L, 20L, 20L, 
20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 40L, 40L, 
40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 
40L, 40L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 41L, 
41L, 41L, 41L, 41L, 41L, 41L, 42L, 42L, 42L, 42L, 42L, 42L, 42L, 
42L, 42L, 42L, 42L, 42L, 42L, 42L, 42L, 42L, 42L, 51L, 51L, 51L, 
51L, 51L, 51L, 51L, 51L, 51L, 51L, 51L, 51L, 51L, 51L, 51L, 51L, 
51L), x1 = c(37, 34, 30.75, 29, 37, 32.25, 25.75, 32.5, 27, 31, 
28.5, 23.75, 25.75, 28.5, 28.5, 27.75, 25.75, 25.75, 27.25, 31, 
32.5, 35.5, 27.25, 32.25, 30.5, 28.75, 29.5, 29, 29, 27, 28.75, 
28.75, 25.75, 25.75, 22, 22, 29, 30, 20, 22, 12, 11.5, 10, 14.5, 
24, 15.5, 23.5, 14, 24, 10, 9, 34, 16, 9.5, 19, 31, 20, 9.5, 
9.5, 21, 29, 20, 26, 26, 24.5, 5, 16.5, 18.5, 22.5, 31.5, 23.5, 
20, 15.25, 20.75, 32, 23.5, 25, 20, 27, 22.5, 24.5, 28.5, 18, 
17.5, 18.5, 34, 30.5, 32.5, 31, 27, 31, 31, 35.5, 31, 31, 29, 
31.5, 29.25, 31, 31, 28, 29)), .Names = c("personid", "x1"), class = "data.frame", row.names = c(NA, 
-102L)) 

答えて

2

あなたが探しているもの(1)いくつか分割apply-の組み合わせである:私は正しくはありません。..

mydata$a <- with(mydata, ave(x1, personID, FUN = function(x) c(TRUE, diff(x) !=-1) & x!=-1)) 

EDITはどこ必ずそれを使用していないことを知っていますアプローチ(基地R、plyrddplyplyrgroup_by + mutatetapply ...(2)diffを組み合わせる

データ:

set.seed(100) 
mydata <- data.frame(
    x1 = sample(c(0:30, 1.5,5.75,9.25,10.25,11.75), 100, replace = TRUE), 
    personID = rep(c(1:10), each = 10) 
) 

あなたは、個々の列の最後の/最初の値について何をしたいのかを決定する必要があります:(NA、0)に等しい(最初、最後の)値はありますか?ここでは最初の値を0に設定します。

diff_to_dummy <- function(x) { 
    c(0,as.numeric(diff(x) <(-1))) 
} 

tapplyは、各personIDためx1に関数を適用します。 unlistは値を戻します。

dval <- with(mydata,unlist(tapply(x1,list(personID),diff_to_dummy))) 
+0

親愛なるベン、ありがとう。最初の値を設定するのは正しいです。私はあなたのコードを理解しようとしています。すべてを複製した後、私はdvalを自分のデータに入れます: 'mydata $ dval <-dval'。このダミーはすべて-1の変化をキャプチャしているようですが、それは正しいのですか?より小さな負の変化(例えば1.25対1)も捕捉したいのですが?ありがとう! – Boris

0

またdplyrを使用することができます。ここでは

library(dplyr) 

result <- mydata %>% group_by(personID) %>% 
        mutate(a = ifelse((x1-lag(x1)) < 0, 1, 0)) %>% 
        mutate(b = ifelse((x1-lag(x1)) <= -1, 1, 0)) 

、我々は変更group_bypersonIDを検出します。関数mutateは、ダミー変数列abを作成します。 diffを使用する代わりに、x1からlag(x1)を差し引いてテストします。

print(result) 
##Source: local data frame [100 x 4] 
##Groups: personID [10] 

##  x1 personID  a  b 
## <dbl> <int> <dbl> <dbl> 
##1  11  1 NA NA 
##2 10.5  1  1  0 
##3  19  1  0  0 
##4  2  1  1  1 
##5  16  1  0  0 
##6  17  1  0  0 
##7  29  1  0  0 
##8  13  1  1  1 
##9  19  1  0  0 
##10  6  1  1  1 

代わりに、我々は条件をテストするためにdiffを使用することができます:私はa1ですがb0である場合を説明するために、行210.5x1を置き換える以外の結果はseed=100を使用してシミュレートされたデータを使用してしかし、NAの結果の前に、mutateによって使用される関数によって返されるものが、入力と同じ長さになるようにする必要があります。

result <- data %>% group_by(personid) %>% 
        mutate(a = c(NA, ifelse(diff(x1) < 0, 1, 0))) %>% 
        mutate(b = c(NA, ifelse(diff(x1) <= -1, 1, 0))) 
+0

こんにちは、これはありがとうございます。私は自分のデータでこれを試して、このエラーが発生しました: "互換性のない型、数値ベクトルが必要です"すべてのNAを削除しましたが、同じエラーが発生しました。 – Boris

+0

@Boris: 'x1'数値ですか?あなたが投稿内のデータを生成した方法から、数値ですが、あなたの実際のデータセットはそうではないかもしれません。 'x1'が数字の場合、' x1'のすべての**インスタンスを 'as.numeric(x1)'でラップして動作させることができます。 – aichao

+0

はい、数値です。何が間違っているのか分かりません。しかし、シミュレーションされたデータではうまくいくように思えます。 – Boris

関連する問題