我的数据框架需要扩展
df1<-structure(list(TotalTime = c(0, 15, 16, 23, 24, 29), PhaseName = structure(c(1L,1L, 2L, 2L, 2L, 3L), .Label = c("A", "B","C"), class = "factor")), .Names = c("TotalTime", "Phase"), row.names = c(NA, 6L), class = "data.frame")
df1:
TotalTime Phase
1 0 A
2 15 A
3 16 B
4 23 B
5 24 B
6 29 C
因此,它成为以下基于TotalTime重复行的数据帧,但是应该为每个数字(秒)填写TotalTime。 (我把......放在示例中以减少空间,但应填充6,7,8,9-15等):
TotalTime Phase
1 0 A
2 1 A
3 2 A
4 3 A
5 4 A
6 5 A
..
16 15 A
17 16 B
18 17 B
.. B
24 23 B
25 24 B
26 25 B
27 26 B
28 27 B
29 28 B
30 29 C
答案 0 :(得分:2)
使用包zoo
和dplyr
:
library(dplyr)
library(zoo)
data.frame(TotalTime=0:max(df1$TotalTime)) %>% left_join(df1) %>% na.locf
它首先创建一个data.frame,其具有从0到29(此处)的孔序列,并将其与您的数据合并。然后我只是做了一个&#34;最后一次观察结果&#34;对合并创建的缺失值进行估算。
也可以使用这样的库data.table
完成:(另见我改编的this answer:
library(data.table)
df1 = data.table(df1, key="TotalTime")
df2=data.table(TotalTime=0:max(df1$TotalTime))
df1[df2, roll=T]
答案 1 :(得分:1)
library(tidyverse)
df1 %>% do(data.frame(TotalTime = first(.$TotalTime):last(.$TotalTime))) %>%
left_join(df1, by="TotalTime") %>%
fill(Phase)
TotalTime Phase
0 A
1 A
2 A
3 A
4 A
5 A
6 A
7 A
8 A
9 A
10 A
11 A
12 A
13 A
14 A
15 A
16 B
17 B
18 B
19 B
20 B
21 B
22 B
23 B
24 B
25 B
26 B
27 B
28 B
29 C
我希望这会有所帮助。
答案 2 :(得分:0)
如果您想查看基本R解决方案。
phases <- with(aggregate(TotalTime~Phase, df1, FUN=min),
rep(Phase, c(diff(TotalTime),
max(df1$TotalTime[df1$Phase == tail(Phase, 1)]) -
min(df1$TotalTime[df1$Phase == tail(Phase, 1)])+1)))
主要&#34;技巧&#34;这是因为rep
的第二个参数可以是一个向量,然后多次重复第一个参数的每个元素。第二个参数是使用每个阶段diff(TotalTime)
的最小值的差异并且连接最终阶段级别的最小值和最大值(+1)的差值来构造的(这里,&#34; C&#34; )。使用aggregate
找到最小值,并使用with
来简化表示法。
然后可以将结果输入data.frame
。
data.frame(period=seq_len(length(phases))-1, phase=phases)
period phase
1 0 A
2 1 A
3 2 A
4 3 A
5 4 A
6 5 A
7 6 A
8 7 A
9 8 A
10 9 A
11 10 A
12 11 A
13 12 A
14 13 A
15 14 A
16 15 A
17 16 B
18 17 B
19 18 B
20 19 B
21 20 B
22 21 B
23 22 B
24 23 B
25 24 B
26 25 B
27 26 B
28 27 B
29 28 B
30 29 C