为每个因子级

时间:2015-09-19 10:49:16

标签: r

我有一个带有因子列的数据框:

 s<- data.frame( id = 901:910)
 s$id<-as.factor(s$id)

我有一系列日期时间:

library(lubridate)
start <- now()+as.difftime(2,units="hours")
t <- seq(from = start, length.out = 60, by = "mins")

我想在t的每个级别s中添加序列s$id作为列。

1 个答案:

答案 0 :(得分:3)

作为expand.grid(id = s$id, time = t)的替代方案,您还可以使用CJ包的data.table(交叉加入):

CJ(s$id,t)

给出:

      V1                  V2
  1: 901 2015-09-19 14:52:23
  2: 901 2015-09-19 14:53:23
  3: 901 2015-09-19 14:54:23
  4: 901 2015-09-19 14:55:23
  5: 901 2015-09-19 14:56:23
 ---                        
596: 910 2015-09-19 15:47:23
597: 910 2015-09-19 15:48:23
598: 910 2015-09-19 15:49:23
599: 910 2015-09-19 15:50:23
600: 910 2015-09-19 15:51:23

如果要将其添加到s,可以执行以下连接操作:

s <- setDT(s, key="id")[CJ(s$id,t)]

给出:

> s
      id                  V2
  1: 901 2015-09-19 15:08:39
  2: 901 2015-09-19 15:09:39
  3: 901 2015-09-19 15:10:39
  4: 901 2015-09-19 15:11:39
  5: 901 2015-09-19 15:12:39
 ---                        
596: 910 2015-09-19 16:03:39
597: 910 2015-09-19 16:04:39
598: 910 2015-09-19 16:05:39
599: 910 2015-09-19 16:06:39
600: 910 2015-09-19 16:07:39

另一种选择是使用crossing中的tidyr - 函数:

library(tidyr)
crossing(id = s$id, time = t)

给出了类似的结果。