r - 在具有多个观察期的数据框中添加缺失的日期值

原文 标签 r date for-loop merge sequence

提前致谢。

我正在尝试为三个不同的人添加未包含在观察期内的缺失日期值。

我的数据是这样的:

 IndID       Date Event Number Percent
1   P01 2011-03-04     1      2   0.390
2   P01 2011-03-11     1      2   0.975
3   P01 2011-03-13     0      9   0.795
4   P01 2011-03-14     0     10   0.516
5   P01 2011-03-15     0      1   0.117
6   P01 2011-03-17     0      7   0.093
IndID是个人 ID( P01P03P06 )。 Date显然是日期。 Event是指示事件是否发生的二元变量(0 = 否和 1 = 是)。
栏目 NumberPercent不直接相关,但需要保留,因此包含在此处。

我的示例数据框( PostData )包含在下面使用 dput .

每个IndID第一个和最后一个 Date分别是观察期的开始和结束,其中缺少日期。在这里,我的目标是为每个人添加缺失的日期并添加 0Event柱子。其他列( NumberPercent )可以保持空白。

This post一直很有用,但缺乏关于我的主要问题的信息 - 多个人。

每个个体的观察期来自min(PostData$Date)max(PostData$Date) .我一直在尝试为每个人创建一个完整的日期序列,然后 merge它与 for 内的现有数据框环形。肯定有更好的主意。

任何建议表示赞赏。
PostData <-structure(list(IndID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
  3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
  5L, 5L), .Label = c("P01", "P02", "P03", "P05", "P06", "P07", 
  "P08", "P09", "P10", "P11", "P12", "P13"), class = "factor"), 
  Date = structure(c(1299196800, 1299801600, 1299974400, 1300060800, 
  1300147200, 1300320000, 1300406400, 1310083200, 1310169600, 
  1310515200, 1310774400, 1310947200, 1311033600, 1311292800, 
  1311552000, 1323129600, 1323388800, 1323648000, 1323993600, 
  1324080000, 1324166400, 1324339200, 1327622400, 1327795200, 
  1327881600), class = c("POSIXct", "POSIXt"), tzone = "GMT"), 
  Event = c(1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 
  0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 0L, 0L), Number = c(2L, 
  2L, 9L, 10L, 1L, 7L, 5L, 9L, 1L, 4L, 5L, 2L, 0L, 1L, 10L, 
  5L, 0L, 6L, 5L, 10L, 9L, 4L, 4L, 8L, 1L), Percent = c(0.39, 
  0.975, 0.795, 0.516, 0.117, 0.093, 0.528, 0.659, 0.308, 0.055, 
  0.185, 0.761, 0.132, 0.676, 0.368, 0.383, 0.272, 0.113, 0.974, 
  0.696, 0.941, 0.751, 0.758, 0.29, 0.15)), .Names = c("IndID", 
  "Date", "Event", "Number", "Percent"), row.names = c(NA, 25L), 
  class = "data.frame")

最佳答案

一个基本的 R 版本:

do.call(rbind,
  by(
    PostData,
    PostData$IndID,
    function(x) {
      out <- merge(
        data.frame(
          IndID=x$IndID[1],
          Date=seq.POSIXt(min(x$Date),max(x$Date),by="1 day")
        ),
        x,
        all.x=TRUE
      )
      out$Event[is.na(out$Event)] <- 0
      out
    }  
  )
)

结果:
       IndID       Date Event Number Percent
P01.1    P01 2011-03-04     1      2   0.390
P01.2    P01 2011-03-05     0     NA      NA
P01.3    P01 2011-03-06     0     NA      NA
P01.4    P01 2011-03-07     0     NA      NA
P01.5    P01 2011-03-08     0     NA      NA
P01.6    P01 2011-03-09     0     NA      NA
P01.7    P01 2011-03-10     0     NA      NA
P01.8    P01 2011-03-11     1      2   0.975
<<etc>>

关于r - 在具有多个观察期的数据框中添加缺失的日期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24155673/

相关文章:

python - 如何从Python 3中的for循环中获取正确的结果?

ios - Swift 3 构建数组(不知道怎么描述)

r - facet_wrap 和缩放点大小

python - R 的 browser() 在 Python 中等效

r - 在 for 循环中分配不同的类

php - Laravel - 选择 - 设置默认选项

r - 从data.table到eval的函数创建表达式

MySQL 显示整个月的所有日期

android - 在 Android 中的特定日期创建日历事件?

javascript - 使用 SpiderMonkey 公共(public) API 复制 for...in 循环