【发布时间】:2017-06-06 16:35:18
【问题描述】:
我有一个名为 df 的 data.frame,在 4 列上有 800 万次观察:
name <- c("Pablo", "Christina", "Steve", "Diego", "Ali", "Brit", "Ruth", "Mia", "David", "Dylan")
year <- seq(2000, 2009, 1)
v1 <- sample(1:10, 10, replace=T)
v2 <- sample(1:10, 10, replace=T)
df <- data.frame(year, v1)
> df
name year v1 v2
1 Pablo 2000 2 9
2 Christina 2001 5 3
3 Steve 2002 8 9
4 Diego 2003 7 6
5 Ali 2004 2 4
6 Brit 2005 1 1
7 Ruth 2006 10 9
8 Mia 2007 6 7
9 David 2008 10 9
10 Dylan 2009 3 2
我想生成一个 data.frame output,其中包含 df 中所有行的成对组合,如下所示:
>output
name year v1 v2 name_2 year_2 v1_2 v2_2
1 Pablo 2000 2 9 Christina 2001 5 3
2 Pablo 2000 2 9 Steve 2002 8 9
3 Pablo 2000 2 9 Diego 2003 7 6
etc.
最快的方法是什么?
【问题讨论】:
-
赞
idx <- t(combn(seq_len(nrow(df)), 2));cbind(df[idx[,1],], df[idx[,2],])? -
tidyr::crossing(df, df) -
@lukeA 确实!但第二系列变量的列名不同。并将输出作为 data.frame。
-
@alistaire 对!但第一行包含一个副本(即 Pablo-Pablo)。是否可以生成没有重复的输出?
-
使用
cbind.data.frame或包裹as.data.frame。之后,您可以使用names(df)<-c("col1", "col2", .....)重命名列
标签: r dataframe data.table dplyr