在R中生成一个新变量,其中第n个观测值取决于另一列的第n-1个观测值

在R中生成一个新变量,其中第n个观测值取决于另一列的第n-1个观测值,r,dataframe,R,Dataframe,假设我有一个如下所示的数据帧: >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

假设我有一个如下所示的数据帧:

>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
现在我想创建一个新变量“veep”,它取决于不同行的“city”和“ceep”的值。比如说,

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 

df$veep[df$ceep(第n-1次观测)==1&city==city(第n-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
 }
}
df$veep 1&idf[i,“veep”]这里有一种写出逻辑步骤的方法。注意使用
idx
对向量进行索引。这是避免索引超出范围所必需的

idx <- seq_len(nrow(df))

# Set a default value for the new variable
df$veep <- NA
您的下一组标准不能应用于
df
的最后三行,因为
n+3
将是一个无效的索引。因此再次使用
head
tail
函数。一个棘手的部分是,第一个
ceep
语句基于
n+2
,而不是
n+3
,以便需要将
头部
尾部
组合在一起

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
df[head(idx,-3),“veep”]df$veep
[1] NA 1 1 NA 1 NA 1 NA 1 NA 1 NA 1 NA

很漂亮,但对新手来说不是有点难吗?@agstudy,你可能是对的。也许一些“炫耀”是正确的。@econlearner,我已经对上面的代码进行了注释,解释了
头部和
尾部的位。行
nrow(df)-1
呢?
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