1

次のようなデータフレームがあるとします。

>df
city  year  ceep
  1    1      1
  1    2      1
  1    3      0
  1    4      1
  1    5      0
  2    1      0
  2    2      1
  2    3      1
  2    4      0
  2    5      1
  3    1      1
  3    2      0
  3    3      1
  3    4      0
  3    5      1

次に、異なる行の「city」と「ceep」の値に依存する新しい変数「veep」を作成します。例えば、

veep=1 if ceep[_n-1]=1 & city=city[_n-1]
veep=1 if ceep[_n+2]=1 & ceep[_n+3]=1 & city=city[_n+3] 

n観測の行はどこにありますか。これらの条件をR言語に翻訳する方法がわかりません。私が問題を抱えているのは、観測の列を選択することだと思います。私は次の行に沿ったどこかのコードを考えています:

df$veep[df$ceep(of the n-1th observation)==1 & city==city(n-1th observ.)] <- 1
df$veep[df$ceep(of the n+2th observation)==1 & df$ceep(of the n+3th observation)==1 &
city==city(n+3th observ.)] <- 1

#note: what's in parentheses is just to demonstrate where I'm having trouble 

誰かがこれについて助けを提供できますか?

4

2 に答える 2

2

論理的な手順を書き出す方法を次に示します。idxベクトルのインデックス付けに を使用していることに注意してください。これは、範囲外のインデックスを回避するために必要でした。

idx <- seq_len(nrow(df))

# Set a default value for the new variable
df$veep <- NA

最初の論理基準セットを の最初の行に適用できませんdf。インデックスn - 1は になり0、これは有効な行インデックスではありません。したがって、 を使用してandtail(*, -1)の最初のエントリを除くすべてを選択し、 を使用してandの最後のエントリを除くすべてを選択します。veepcityhead(*, -1)ceepcity

df[tail(idx, -1), "veep"] <- ifelse(
  head(df$ceep, -1) == 1 &
  tail(df$city, -1) == head(df$city, -1),
  1, tail(df$veep, -1))

次の基準セットは、 の最後の 3 行には適用できません。無効なインデックスになるdfからです。そのため、関数と関数を再度n + 3使用します。1 つのトリッキーな部分は、最初のステートメントがではなくに基づいているため、との組み合わせが必要であるという事実です。headtailceepn + 2n + 3headtail

df[head(idx, -3), "veep"] <- ifelse(
  head(tail(df$ceep, -2), -1) == 1 &
  tail(df$ceep, -3) == 1 &
  head(df$city, -3) == tail(df$city, -3),
  1, head(df$veep, -3))

> df$veep
 [1] NA  1  1 NA  1 NA NA  1  1 NA NA  1 NA  1 NA
于 2012-11-29T13:45:37.813 に答える
1

このような for ループを使用できます

df$veep <- 0   

for (i in seq(nrow(df))){
 if (i > 1 & i < nrow(df)-2){
    if (df[i-1,"ceep"]==1 & df[i-1,"city"] == df[i,"city"])
       df[i,"veep"] <- 1
 }
}
于 2012-11-29T13:24:10.853 に答える