【问题标题】:Subsetting an integer vector based on a vector of corresponding dates根据对应日期的向量对整数向量进行子集化
【发布时间】:2014-07-30 16:05:28
【问题描述】:

初级问题:

我正在尝试根据与我希望子集化的向量相对应的日期向量对数据框的向量进行子集化。以以下数据框为例:

     Date    Time Axis1 Day Sum.A1.Daily
1 6/12/10 5:00:00    20   1           NA
2 6/12/10 5:01:00    40   1           NA
3 6/12/10 5:02:00    50   1           NA
4 6/13/10 5:03:00    10   2           NA
5 6/13/10 5:04:00    20   2           NA
6 6/13/10 5:05:00    30   2           NA

我想用每天的值的总和填充右侧的列。基本上,(1:3,5) 应该 = 110,(4:6,5) 应该 = 60。

我知道有很多方法可以比我尝试做的更智能/更快/更好(例如,我的日期变量是一个因素,分为我不知道如何访问的“级别” ),但我正在尝试从头开始培养我的技能,并想弄清楚如何:

  1. 获取数据$Axis1 的子集,该子集将仅获取第一天的值
  2. 获取 data$Axis1 值的子集,该子集将仅获取第 2 天的值
  3. 总结每一天的值,并将它们放在第 5 列中,覆盖“NA”

我成功地执行了一个与此类似的功能来自动填充“Day”向量,该向量最初充满了“NA”值(如下)。但是当我考虑如何 a) 使用日期进行子集化,以及 b) 在子集化时求和时,我陷入了困境。

提前感谢您的帮助 - 另外,如果我的问题更清楚/我违反了基本的 stackoverflow 规则,请告诉我。我对 R 和整个编码社区都很陌生;感谢您的帮助!

dates <-c("6/12/10","6/13/10")
counts <- c(1:2)
x <- nrow(data)

for (i in 1:x) {
      for (j in 1:12) {
            if (data[i,1] == dates[j]) {
                  data[i,4] <- counts[j]
            }
      }
}

【问题讨论】:

    标签: r date for-loop vector subset


    【解决方案1】:

    使用ave

    transform(dat,Sum.A1.Daily=ave(dat$Axis1,dat$Date,FUN=sum))
         Date    Time Axis1 Day Sum.A1.Daily
    1 6/12/10 5:00:00    20   1          110
    2 6/12/10 5:01:00    40   1          110
    3 6/12/10 5:02:00    50   1          110
    4 6/13/10 5:03:00    10   2           60
    5 6/13/10 5:04:00    20   2           60
    6 6/13/10 5:05:00    30   2           60
    

    【讨论】:

      【解决方案2】:

      另一种方法是使用 data.table

      #Let's say df is your dataset
      library(data.table)
      dt = as.data.table(df)
      dt = dt[, Sum.A1.Daily := sum(Axis1), by = Date]
      

      【讨论】:

      • 您不需要merge 语句。 dt[,Sum.A1.Daily:=sum(Axis1),by=Date]
      猜你喜欢
      • 2020-10-29
      • 2017-12-13
      • 2017-08-02
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      相关资源
      最近更新 更多