完成序列列并填写行

cel*_*low 5 time r sequence dataframe dplyr

我从一个数据集开始,该数据集具有数字列(在我的例子中是时间,但采用数字格式)、时间戳的特定事件和 ID。我希望运行一些代码来扩展数据框以填充数字序列,同时复制事件列(以及任何其他相关列)。我想通过 ID 来运行它,这样我就不会填补 ID 之间的空白。

这是我开始使用的数据的简化示例。我想分别填充每个 ID 的“值”列的序列,使用每个“事件”第一行的数据完成每个新行。

 a<-c("162", "164", "169", "171", "174", "188", "191", "198","200")
b<-c("start1","end1","start2", "event", "end2", "start1", "end1", "start2", "end2")
c<-c("A","A","A", "A", "A", "B", "B", "B", "B")

original<-data.table(value = a, event = b, ID = c)
Run Code Online (Sandbox Code Playgroud)

这是我的最终目标的重构:

agoal<-c(seq(from = 162, to = 174), seq(from = 188, to = 200))
bgoal<-c("start1","start1","end1","end1", "end1", "end1", "end1",
     "start2", "start2",  "event", "end2","end2", "end2", 
     "start1", "start1", "start1", "end1", "end1", "end1", "end1", "end1", "end1", "end1",
     "start2", "start2","end2")
cgoal<-c(rep("A",13), rep("B",13))

goal<-data.table(value = agoal, event = bgoal, ID = cgoal)
Run Code Online (Sandbox Code Playgroud)

抱歉,如果这不是很清楚!

小智 1

有两个部分需要处理:a)如何为列中缺失的数字添加行value,b)如何填充event之前的内容。(b) 很简单(只需使用fill)。(a) 可以通过使用您想要的所有值创建一个新数据框并与原始数据框连接来完成:

library(tidyverse)

original %>%
  group_by(ID) %>%
  summarize(a = as.integer(min(value)),
            b = as.integer(max(value))) %>%
  transpose() %>%
  map(~ data.frame(ID = .x$ID, value = .x$a:.x$b)) %>%
  reduce(bind_rows) %>%
  left_join(original, by = c("value", "ID")) %>%
  group_by(ID) %>%
  fill(event, .direction = "down")
Run Code Online (Sandbox Code Playgroud)

一步步:

  1. value获取每组内列的最小值和最大值
  2. 使用将数据帧拆分为列表transpose(这将给出一个嵌套列表,其中第一级按行号索引,第二级按列名索引)
  3. 用于map为每个 ID 创建一个数据帧列表,其中一value列包含原始最小值和最大值之间的所有值
  4. reduce使用和将所有数据帧混在一起bind_rows
  5. 与原来使用valueand连接ID;请注意,这left_join将确保所有新的valueID组合都存在,即使它们在原始中没有任何相应的组合(这将导致任何缺失event值具有 NA,这就是您下一步想要的)
  6. 用该组中之前的事件向下填充所有 NA

结果:

   ID value  event
1   A   162 start1
2   A   163 start1
3   A   164   end1
4   A   165   end1
5   A   166   end1
6   A   167   end1
7   A   168   end1
8   A   169 start2
9   A   170 start2
10  A   171  event
11  A   172  event
12  A   173  event
13  A   174   end2
14  B   188 start1
15  B   189 start1
16  B   190 start1
17  B   191   end1
18  B   192   end1
19  B   193   end1
20  B   194   end1
21  B   195   end1
22  B   196   end1
23  B   197   end1
24  B   198 start2
25  B   199 start2
26  B   200   end2
Run Code Online (Sandbox Code Playgroud)

as.integer请注意,如果您将数值作为 中的实际数字,则实际上不需要这两个调用original。另外,我认为在OP中你的意思是event连续三次而不是一次(否则模式就被打破了)。