根据序列将重复行添加到R数据帧

时间:2016-11-25 14:00:00

标签: r dataframe

我的数据框架需要扩展

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

3 个答案:

答案 0 :(得分:2)

使用包zoodplyr

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)

您可以使用dplyrtidyr完成相关工作:

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