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 

任何人都可以提供帮助吗?

4

2 回答 2

2

这是一种写出逻辑步骤的方法。请注意使用idx来索引向量。这对于避免超出范围的索引是必要的。

idx <- seq_len(nrow(df))

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

您的第一组逻辑标准不能应用于 的第一行df,因为索引n - 10,而这不是有效的行索引。因此,用于tail(*, -1)挑选除 and 的第一个条目之外的所有条目,veepcity使用head(*, -1)挑选除ceepand的最后一个条目之外的所有条目city

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

您的下一组标准不能应用于 的最后三行df,因为n + 3那样将是无效索引。所以再次使用headandtail函数。一个棘手的部分是第一个ceep语句基于n + 2, not n + 3,因此需要head和的组合tail

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 回答