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)
一步步:
value获取每组内列的最小值和最大值transpose(这将给出一个嵌套列表,其中第一级按行号索引,第二级按列名索引)map为每个 ID 创建一个数据帧列表,其中一value列包含原始最小值和最大值之间的所有值reduce使用和将所有数据帧混在一起bind_rowsvalueand连接ID;请注意,这left_join将确保所有新的value和ID组合都存在,即使它们在原始中没有任何相应的组合(这将导致任何缺失event值具有 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连续三次而不是一次(否则模式就被打破了)。
| 归档时间: |
|
| 查看次数: |
2854 次 |
| 最近记录: |