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。试试看谢谢你的评论!您的建议效果很好,只是只包含了一个条件,例如,只有上午和中午之间的延迟时间会被计算,但中午和晚上之间不会。谢谢您的评论!你的建议效果很好,除了只包含一个条件,例如,只有早上和中午之间的延迟得到计算,而不是中午和晚上。非常感谢你,效果非常好。也谢谢你的简短解释!非常感谢你,效果非常好。也谢谢你的简短解释!谢谢你的评论!很遗憾,我不理解你的建议。谢谢你的评论!很遗憾,我不理解你的建议。