重组/重塑数据框架(r)

时间:2016-04-13 18:38:08

标签: r reshape2

我的数据集重复观察了项目工作人员。我需要一个包含两列的数据框,列出每个人和时间点的项目“组合”。让我用一个例子来解释:

这是我的数据:

ID    Week    Project    
01    1       101
01    1       102 
01    1       103
01    2       101
01    2       102
02    1       101
02    1       102
02    2       101

第1个人(ID = 1)在第1周开展了三个项目。这意味着本周有6个项目组合(project_i和project_j)。

这就是我需要的

ID   Week    Project_i  Project_j
01    1      101        101
01    1      101        102
01    1      101        103
01    1      102        101
01    1      102        102    
01    1      102        103
01    1      103        101
01    1      103        102
01    1      103        103
01    2      101        101
01    2      101        102
01    2      102        101
01    2      102        102
02    1      101        101
02    1      101        102
02    1      102        101
02    1      102        102
02    2      101        101

每周只有一个项目的丢失案例不是问题。

我已尝试过基本的r和reshape2了一下,但我无法弄明白。

2 个答案:

答案 0 :(得分:6)

以这种方式:

library(data.table)
setDT(DT)

DT[, CJ(P1 = Project, P2 = Project)[P1 != P2], by=.(ID, Week)]

    ID Week  P1  P2
 1:  1    1 101 102
 2:  1    1 101 103
 3:  1    1 102 101
 4:  1    1 102 103
 5:  1    1 103 101
 6:  1    1 103 102
 7:  1    2 101 102
 8:  1    2 102 101
 9:  2    1 101 102
10:  2    1 102 101

CJ是两个向量的笛卡尔连接,采用所有组合。

如果您不想要(101,102)和(102,101),请使用P1 > P2代替P1 != P2。哦,OP改变了问题......所以使用P1 <= P2

答案 1 :(得分:5)

以下是使用expand.grid的基本选项:

do.call(rbind, lapply(split(df, paste(df$ID, df$Week)), function(x){
    x2 <- expand.grid(ID = unique(x$ID), 
                      Week = unique(x$Week), 
                      Project_i = unique(x$Project), 
                      Project_j = unique(x$Project))
    # omit if 101 102 is different from 102 101; make `<` if 101 101 not possible
    x2[x2$Project_i <= x2$Project_j,]
}))

#       ID Week Project_i Project_j
# 1 1.1  1    1       101       101
# 1 1.4  1    1       101       102
# 1 1.5  1    1       102       102
# 1 1.7  1    1       101       103
# 1 1.8  1    1       102       103
# 1 1.9  1    1       103       103
# 1 2.1  1    2       101       101
# 1 2.3  1    2       101       102
# 1 2.4  1    2       102       102
# 2 1.1  2    1       101       101
# 2 1.3  2    1       101       102
# 2 1.4  2    1       102       102
# 2 2    2    2       101       101