4

次のようにフォーマットされた205,000行以上のデータフレームがあります。

df <- data.frame(project.id = c('SP001', 'SP001', 'SP001', 'SP017', 'SP018', 'SP017'),
                 supplier.id = c('1224', '5542', '7741', '1224', '2020', '9122'))

実際のデータ フレームには、 の 6700 以上の一意の値がありproject.idます。同じプロジェクトに携わったサプライヤーをペアにしたエッジリストを作成したいと考えています。

の望ましい最終結果project.id = SP001:

to     from
1224   5542
1224   7741
5542   7741

これまでのところsplit、 project.id でリストを作成するために使用してから、実行して各リスト/グループ内lapply+combnのすべての可能な組み合わせを生成しようとしました:supplier.id

try.list <- split(df, df$project.id)
try.output <- lapply(try.list, function(x) combn(x$supplier.id, 2))

このようなものを生成するためのよりエレガントで効率的な (「2 時間以内に計算」を読む) 方法はありますか?

どんな助けでも大歓迎です

4

3 に答える 3

6

splitとを使用する代わりに、パッケージlapplyを使用できます。dplyr

df <- data.frame(project.id = c('SP001', 'SP001', 'SP001', 'SP017', 'SP018', 'SP017'),
                 supplier.id = c('1224', '5542', '7741', '1224', '2020', '9122'),
                 stringsAsFactors = FALSE)

library(dplyr)

df %>% group_by(project.id) %>%
  filter(n()>=2) %>% group_by(project.id) %>%
 do(data.frame(t(combn(.$supplier.id, 2)), stringsAsFactors=FALSE))
# Source: local data frame [4 x 3]
# Groups: project.id [2]

#   project.id    X1    X2
#        (chr) (chr) (chr)
# 1      SP001  1224  5542
# 2      SP001  1224  7741
# 3      SP001  5542  7741
# 4      SP017  1224  9122
于 2016-01-08T06:32:22.230 に答える
2

で試すことができますigraph

library(igraph)
m1 <- get.edgelist(graph.adjacency(crossprod(table(df))))
m1[m1[,1]!= m1[,2],]
#      [,1]   [,2]  
#[1,] "1224" "5542"
#[2,] "1224" "7741"
#[3,] "1224" "9122"
#[4,] "5542" "1224"
#[5,] "5542" "7741"
#[6,] "7741" "1224"
#[7,] "7741" "5542"
#[8,] "9122" "1224"
于 2016-01-08T06:35:56.997 に答える