Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如果满足某些条件,则从下一行的变量中减去一个变量_R_Loops_If Statement_Conditional Statements - Fatal编程技术网

R 如果满足某些条件,则从下一行的变量中减去一个变量

R 如果满足某些条件,则从下一行的变量中减去一个变量,r,loops,if-statement,conditional-statements,R,Loops,If Statement,Conditional Statements,如果满足某些条件,我想从下一行的变量中减去一个变量。 考虑下面的数据帧: time <- c(12, 14, 16, 10, NA, 18) type <- c("morning", "noon", "evening", "morning", "noon", "evening") data <- data.frame(time, type) 因为我的数据中有

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

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
}
所以我想从第2行的时间中减去第1行的时间值,并将结果存储在第2行的变量“difference”中。但是,只有在满足这两个条件中的一个条件时,才应减去这些值。

也许您可以尝试一下

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
资料

也许你可以试试这个

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
资料

diff是两个值之间基本差异的主要函数。 您可以一次性计算出所有差异,然后用NA覆盖不在所需比较中的差异

使用的数据:

time <- c(12, 14, 16, 10, NA, 18)
type <- c("morning", "noon", "evening", "morning", "noon", "evening")
data <- data.frame(time, type, stringsAsFactors=FALSE)
diff是两个值之间基本差异的主要函数。 您可以一次性计算出所有差异,然后用NA覆盖不在所需比较中的差异

使用的数据:

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

这是另一个选择。Lag函数将允许检索前一行的值

library(data.table)
library(dplyr)
time <- c(12, 14, 16, 10, NA, 18)
type <- c("morning", "noon", "evening", "morning", "noon", "evening")
data <- data.table(time, type)
data[,difference :=
 ifelse(((time > lag(time)) & (type == "noon") & (lag(type) == "morning")),time - lag(time),NA)]

这是另一个选择。Lag函数将允许检索前一行的值

library(data.table)
library(dplyr)
time <- c(12, 14, 16, 10, NA, 18)
type <- c("morning", "noon", "evening", "morning", "noon", "evening")
data <- data.table(time, type)
data[,difference :=
 ifelse(((time > lag(time)) & (type == "noon") & (lag(type) == "morning")),time - lag(time),NA)]

通过ThomasIsCoding将优雅的代码翻译成dplyr


通过ThomasIsCoding将优雅的代码翻译成dplyr


您的示例数据不起作用。你错过了向量开头的c,你有智能引号。此外,cbind将创建一个矩阵,而不是data.frame。请尝试您的示例数据不起作用的时间。你错过了向量开头的c,你有智能引号。此外,cbind将创建一个矩阵,而不是data.frame。试试看谢谢你的评论!您的建议效果很好,只是只包含了一个条件,例如,只有上午和中午之间的延迟时间会被计算,但中午和晚上之间不会。谢谢您的评论!你的建议效果很好,除了只包含一个条件,例如,只有早上和中午之间的延迟得到计算,而不是中午和晚上。非常感谢你,效果非常好。也谢谢你的简短解释!非常感谢你,效果非常好。也谢谢你的简短解释!谢谢你的评论!很遗憾,我不理解你的建议。谢谢你的评论!很遗憾,我不理解你的建议。