首页 > 解决方案 > 如果满足某些条件,则从下一行中的变量中减去变量

问题描述

如果满足某些条件,我想从下一行的变量中减去一个变量。考虑以下数据框:

time <- c(12, 14, 16, 10, NA, 18)
type <- c("morning", "noon", "evening", "morning", "noon", "evening")
data <- data.frame(time, type)

由于我的数据中有 4000 行,因此我需要一个具有两个变化值的循环(用于两行感兴趣的行)。我还没有尝试实现循环,因为我很难在列中选择特定的行和特定的值。(但我也非常感谢有关如何包含循环的建议!)到目前为止,代码如下所示:

if(data[which(data[row1, "type"] =="morning")] & data[which(data[row2, "type"] == "noon")]) | data[which(data[row1, "type"] =="noon")] & data[which(data[row2, "type"] == "evening")]) {
data[row2, "difference"] <- data[row2, "time"] - data[row1, "time"] 
}  else{
  data[row2, “difference"] <- NA
}

所以我想从row2中的时间减去row1中的时间值,并将结果存储在row2中的变量“difference”中。但是,仅当满足两个条件之一时才应减去这些值。

标签: rloopsif-statementconditional-statements

解决方案


也许你可以试试这个

transform(
  data,
  difference = ave(time, cumsum(type == "morning"), FUN = function(x) c(NA, diff(x)))
)

这使

  time    type difference
1   12 morning         NA
2   14    noon          2
3   16 evening          2
4   10 morning         NA
5   NA    noon         NA
6   18 evening         NA

数据

> dput(data)
structure(list(time = c(12, 14, 16, 10, NA, 18), type = c("morning", 
"noon", "evening", "morning", "noon", "evening")), class = "data.frame", row.names = c(NA,
-6L))

推荐阅读