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
-P2
和 P2
-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-P1
、P2-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)
我无法按需要的方式处理数据。采用以下示例数据框:
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
-P2
和 P2
-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-P1
、P2-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)