如何在数据帧的列上使用 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)]))
我正在使用的数据集具有不同类型 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)]))