如何在数据帧的列上使用 R 的 diff 函数,条件是在不同列中具有特定值

How to use the diff function of R on a column of a dataframe conditional on having a particular value in a different column

我正在使用的数据集具有不同类型 public 交通工具和不同年份的平均乘客量。我有兴趣创建一个新专栏,显示每种 public 交通工具的平均载客量与前一年相比的增长情况。 我尝试使用的代码如下:

for (i in 1:length(public_trans$type_of_public_transport)) {
  if (public_trans$type_of_public_transport[i] == public_trans$type_of_public_transport[i+1]) {
    ridership_diff[i] <- ifelse(public_trans$average_ridership == 0, 0, public_trans$average_ridership[i+1] - public_trans$average_ridership[i])
    next}}

我得到的输出 运行 代码是这样的: “if (public_trans$type_of_public_transport[i] == public_trans$type_of_public_transport[i + 中的错误: TRUE/FALSE 需要的缺失值 此外:有 50 个或更多警告(使用 warnings() 查看前 50 个)"

通过将循环起点从“1:length(public_trans$type_of_public_transport))”更改为“0:length(public_trans$type_of_public_transport))",输出错误变为: “if (public_trans$type_of_public_transport[i] == public_trans$type_of_public_transport[i + 中的错误: 参数的长度为零

此外,即使我的代码有效,我也很确定有一种更简单、更直接的方法可以获得我想要的结果。

当循环到达最后一行并且 i + 1 没有条目时会出现此问题。 OP 还提到从 0 开始索引,但是 R 索引从 1 开始。一个选项是循环直到最后一行

for (i in 1:(length(public_trans$type_of_public_transport) - 1)) {
    if (public_trans$type_of_public_transport[i] == 
         public_trans$type_of_public_transport[i+1]) {
 ridership_diff[i] <- ifelse(public_trans$average_ridership[i] == 0, 0, 
      public_trans$average_ridership[i+1] - public_trans$average_ridership[i])
}}

ifelse 是向量化的,所以我们这里不需要循环

ridership_diff <- with(public_trans,  ifelse(type_of_public_transport[-1] == type_of_public_transport[-nrow(public_trans)] & average_ridership[-nrow(publlic_trans)] == 0,
        0, average_ridership[-1] -average_ridership[-nrow(public_trans)]))