替代expand.grid for data.frames

时间:2012-07-27 18:27:35

标签: r

我有一个data.frame df,我希望此df中的每一行重复lengthTime次,并添加一个从1到{{1对于lengthTime中的每一行。

我知道,这听起来很复杂,但我基本上想要的是将df应用于expand.grid。这是一个丑陋的解决方法,我觉得最容易解决的问题(甚至可能是base-R函数?):

df

我认为我可以使用df <- data.frame(ID = rep(letters[1:3], each=3), CatA = rep(1:3, times = 3), CatB = letters[1:9]) lengthTime <- 3 nrRow <- nrow(df) intDF <- df for (i in 1:(lengthTime - 1)) { df <- rbind(df, intDF) } df$Time <- rep(1:lengthTime, each=nrRow) ,但这不起作用。 expand.grid(df, 1:lengthTime)也没带来任何运气。那么有人知道一个好的解决方案吗?

6 个答案:

答案 0 :(得分:51)

自从这个问题发布以来已经有一段时间了,但我最近遇到了它正在寻找标题中的东西,即适用于数据框的expand.grid。发布的答案解决了OP更具体的问题,因此,如果有人正在寻找更通用的数据框解决方案,这里有一个更为通用的方法:

expand.grid.df <- function(...) Reduce(function(...) merge(..., by=NULL), list(...))

# For the example in the OP
expand.grid.df(df, data.frame(1:lengthTime))

# More generally
df1 <- data.frame(A=1:3, B=11:13)
df2 <- data.frame(C=51:52, D=c("Y", "N"))
df3 <- data.frame(E=c("+", "-"))
expand.grid.df(df1, df2, df3)

答案 1 :(得分:16)

为什么不像df[rep(1:nrow(df),times = 3),]那样扩展数据框,然后像上面那样使用df$Time <- rep(1:lengthTime, each=nrRow)添加额外的列?

答案 2 :(得分:11)

你也可以使用merge做一个简单的NULL作为合并列(这将导致merge进行简单的组合数据复制):

merge(data.frame(time=1:lengthTime), iris, by=NULL)

答案 3 :(得分:8)

快速更新

现在还有包tidyr中的crossing()函数可以用来代替merge,有点快,并返回一个tbl_df / tibble。

data.frame(time=1:10) %>% merge(iris, by=NULL) 

data.frame(time=1:10) %>% tidyr::crossing(iris) 

答案 4 :(得分:2)

这有效:

REP <- rep(1:nrow(df), 3)
df2 <- data.frame(df[REP, ], Time = rep(1:3, each = 9))
rownames(df2) <- NULL
df2

答案 5 :(得分:1)

->add('condition', 'entity', array( 'class' => YourAppBundle:YourEntityProduct 'label' => 'Stan', )); 解决方案:

data.table

另一个:

> library(data.table)
>  ( df <- data.frame(ID   = rep(letters[1:3], each=3),
+                  CatA = rep(1:3, times = 3),
+                  CatB = letters[1:9]) )
  ID CatA CatB
1  a    1    a
2  a    2    b
3  a    3    c
4  b    1    d
5  b    2    e
6  b    3    f
7  c    1    g
8  c    2    h
9  c    3    i
> ( DT <- data.table(df)[, lapply(.SD, function(x) rep(x,3))][, Time:=rep(1:3, each=nrow(df0))] )
    ID CatA CatB Time
 1:  a    1    a    1
 2:  a    2    b    1
 3:  a    3    c    1
 4:  b    1    d    1
 5:  b    2    e    1
 6:  b    3    f    1
 7:  c    1    g    1
 8:  c    2    h    1
 9:  c    3    i    1
10:  a    1    a    2
11:  a    2    b    2
12:  a    3    c    2
13:  b    1    d    2
14:  b    2    e    2
15:  b    3    f    2
16:  c    1    g    2
17:  c    2    h    2
18:  c    3    i    2
19:  a    1    a    3
20:  a    2    b    3
21:  a    3    c    3
22:  b    1    d    3
23:  b    2    e    3
24:  b    3    f    3
25:  c    1    g    3
26:  c    2    h    3
27:  c    3    i    3