R - 获取所有具有相同 ID 的值对

R - get all pairs of values with same ID

我无法按需要的方式处理数据。采用以下示例数据框:

df <- data.frame(id=factor(c(1,1,1,2,2,3)), person=c('P1','P2','P3','P4','P1','P3'))

  id person
1  1     P1
2  1     P2
3  1     P3
4  2     P4
5  2     P1
6  3     P3

我想生成一个数据框,其中包含每个 id所有 中的每个可能的 person 对(即 P1-P2P2-P1 是唯一的)。例如:

  id  person1  person2
1  1       P1       P2
2  1       P1       P3
3  1       P2       P1
4  1       P2       P3
5  1       P3       P1
6  1       P3       P2
7  2       P4       P1
8  2       P1       P4
9  3       P3       NA

注意:注意id'3'和person'P3'没有任何其他匹配的人,因此在person2列中有一个NA最终数据框。尽管这是非常需要的,但如果不可能或非常困难,我将采取仅省略 id 3 或仅将 P3 值与自身匹配的响应(例如,P3-P3).

如果我没有很好地表达这一点,请告诉我,我很乐意详细说明。谢谢!

您可以使用 id 作为密钥对 df 执行 merge。但是,它会显示与自身匹配的人(例如 P1-P1P2-P2 等)。之后您可以删除这些行。

# Data in question
df <- data.frame(id=factor(c(1,1,1,2,2,3)), 
                 person=c('P1','P2','P3','P4','P1','P3'))

# Merge with itself
df2 <- merge(df, df, by = "id", suffixes = c("1", "2"), all.x = TRUE)

   id person1 person2
1   1      P1      P1
2   1      P1      P2
3   1      P1      P3
4   1      P2      P1
5   1      P2      P2
6   1      P2      P3
7   1      P3      P1
8   1      P3      P2
9   1      P3      P3
10  2      P4      P4
11  2      P4      P1
12  2      P1      P4
13  2      P1      P1
14  3      P3      P3

# Remove self matches
subset(df2, person1 != person2)

   id person1 person2
2   1      P1      P2
3   1      P1      P3
4   1      P2      P1
6   1      P2      P3
7   1      P3      P1
8   1      P3      P2
11  2      P4      P1
12  2      P1      P4

您可以使用合并功能将 data.frame 合并到自身,如下所示:

new.df=unique(merge(df, df, by='id'))

在它后面加上一个子集函数,以排除两列中具有同一个人的任何内容:

final.df=subset(new.df, person.x!=person.y)