【问题标题】:Performing calculation between rows (observations) in your dataframe在数据框中的行(观察)之间执行计算
【发布时间】:2019-10-07 12:53:33
【问题描述】:

假设我有一个这样的数据框:

data = structure(list(yaw = c(1, 1, 2, 3, 5), z = c(1, 2, 3, 4, 5), 
    x = c(1, 3, 2, 2, 3)), row.names = c(NA, 5L), class = "data.frame")

我想在每一行(观察)和它之前的行之间执行计算,然后将其保存为数据框中的新列(或者保存为新数据集?例如:

newdata <- data %>%
mutate(Yaw = Row2Yaw - Row1Yaw) %>%
mutate(hypotenuse = sqrt((Row2X - Row1X)^2 + (Row2Z - Row1Z)^2) %>%
mutate(lane_deviation = sin(Yaw) * hypotenuse)

因此,这为我提供了这两行之间差异的 lane_deviation 值。理想情况下,我想为每个观察计算这个(即 Row3Yaw - Row2Yaw)等......)

这在 dplyr 中是否可行,还是我需要某种形式的循环?任何帮助表示赞赏!

【问题讨论】:

  • 只需使用laglead,您的代码应该可以正常工作。或者只使用diff- 这应该更容易
  • 例如Yaw 就是 diff(data$yaw)hypotenuse 就是 sqrt(diff(data$x)^2 + diff(data$z)^2) 等等。
  • @DavidArenburg 为了计算差异,然后将其添加到先前的值,即计算 Row2 和 Row1 之间的车道偏差,然后计算 Row3 和 Row2 之间的偏差并将其添加到以前的值等等...?

标签: r dataframe dplyr tidyr


【解决方案1】:

您也可以使用data.table 来实现这一点-

setDT(data)
data[,hypotenuse:=sqrt((lead(yaw)-yaw)*2 + (lead(yaw)-yaw)*2)]
data[,lane_deviation:=sin(yaw) * hypotenuse]

正如@David 在 cmets 中提到的,我们可以使用 lead 函数

并使用dplyr

newdata <- data %>%
    mutate(Yaw = lead(yaw)-yaw) %>%
    mutate(hypotenuse = sqrt((lead(yaw)-yaw)^2 + (lead(yaw)-yaw)^2)) %>%
               mutate(lane_deviation = sin(Yaw) * hypotenuse)

【讨论】:

  • 我需要做什么才能像这里一样计算差异,然后将其添加到之前的值,即计算 Row2 和 Row1 之间的车道偏差,然后计算 Row3 和 Row2 之间的偏差并将其添加到之前的计算值等等...?
猜你喜欢
  • 1970-01-01
  • 2021-07-16
  • 2017-07-19
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 2021-01-14
  • 2022-12-09
相关资源
最近更新 更多