【问题标题】:Sumifs between two numbers across different dataframes跨不同数据帧的两个数字之间的 Sumifs
【发布时间】:2018-02-22 15:16:42
【问题描述】:

我有两个数据框。一个带有“from”和“to”间隔的,如下所示;

Intervals <- data.frame("From" = c(0.0000,0.0069,0.0139,0.0208,0.0278,0.0347,0.0417,0.0486,0.0556,0.0625,0.0694,0.0764,0.0833),
                        "To" = c(0.0410,0.0479,0.0549,0.0618,0.0688,0.0757,0.0826,0.0896,0.0965,0.1035,0.1104,0.1174,0.1243))

第二个数据框是:

x <- data.frame("Dummy" = c(0,1,0,0,0,0,0,0,1,0,0,0,0), 
                "Dummy Time" = c(0,0,0.006944444,0.006944444,0.010416667,0.010416667,0.013888889,0.013888889,0.020833333,0.024305556,0.027777778,0.03125,0.03125))

因此,如果虚拟时间介于 df 区间的 From 和 To(或等于)之间,我基本上想在 R 中对虚拟变量进行 sumifs。这在 excel 中很容易,但对 R 来说我很新。

cbind 不起作用,因为 Intervals 和 x 是不同的行。基本上间隔只是标准日,我希望在间隔上创建一个新列,以显示该时间段内发生的虚拟总和

【问题讨论】:

  • 你的预期输出是什么

标签: r sum plyr


【解决方案1】:

我能想到的最透明的方式是:

n_interval = nrow(Intervals)
Intervals$DummySum = numeric(n_interval)
for(i in 1:n_interval) {
  ind_i = x$DummyTime >= Intervals$From[i] & x$DummyTime < Intervals$To[i]
  Intervals$DummySum[i] = sum(x$Dummy[ind_i])
}

这只是循环遍历所有区间,识别每个区间内的 Dummies,并对值求和。

如果你不喜欢for循环,你可以使用sapply:

Intervals$DummySum = 
  sapply(1:nrow(Intervals), function(i) sum(
    x$Dummy[
      x$DummyTime >= Intervals$From[i] & x$DummyTime < Intervals$To[i]
      ]
  ))

最后,你可以把它变成一个更通用的函数,像这样:

sum_in_intervals = function(interval_start, interval_end, times, values, na.rm = FALSE) {
  stopifnot(length(interval_start) == length(interval_end))
  stopifnot(length(times) == length(values))

  return(
    sapply(1:length(interval_start), function(i) sum(
      values[
        times >= interval_start[i] & times < interval_end[i]
      ], 
      na.rm = na.rm
    ))
  )
}

Intervals$DummySum = sum_in_intervals(Intervals$From, Intervals$To, x$DummyTime, x$Dummy)

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 2019-12-06
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 2013-08-06
    • 2021-03-20
    • 1970-01-01
    相关资源
    最近更新 更多