在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&i df[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