如何在R中将长数据框转换为一对一配对相关数据框?
问题描述
现有如下长格式数据框:
a <- data.frame(group=c(1, 1, 1, 2, 2, 2), name=c('A', 'B', 'C', 'A', 'B', 'C'), value=c(0.2, 0.3, 1, 0.3, 0.6, 0.1) )
需要实现以下需求:
- 生成
name列的全配对数据框out1 - 生成去重后的配对数据框
out2(用于后续绘制如下相关图)
library(ggplot2) ppa <- ggplot(data=out2, aes(x=value1, y=value2, color=name1))+ geom_point()+ geom_smooth(method='lm',level=0.99)+ facet_grid(name2~name1) ggsave(ppa, file='t1.png', width=5, height=4)
- 如何获取配对数据的上三角或下三角?
偏好使用dplyr实现,base R方法也可接受。
解决方案
1. 生成全配对数据框out1
通过基于group的自连接,实现同组内name的全配对(包含自身配对如A-A、反向配对如A-B/B-A):
dplyr方法
library(dplyr) out1 <- a %>% inner_join(a, by = "group", suffix = c("1", "2")) %>% select(group, name1 = name.x, name2 = name.y, value1 = value.x, value2 = value.y)
base R方法
out1 <- merge(a, a, by = "group", suffixes = c("1", "2")) out1 <- out1[, c("group", "name1", "name2", "value1", "value2")]
2. 生成去重配对数据框out2
通过筛选排除反向重复配对,仅保留唯一的配对组合(可选择是否包含自身配对):
不含自身配对(仅保留A-B、A-C这类单向配对)
# dplyr方法 out2 <- out1 %>% filter(name1 < name2) # base R方法 out2 <- out1[out1$name1 < out1$name2, ]
包含自身配对(保留A-A、B-B等)
# dplyr方法 out2 <- out1 %>% filter(name1 <= name2) # base R方法 out2 <- out1[out1$name1 <= out1$name2, ]
3. 获取上三角/下三角配对数据
基于name的字符顺序筛选即可(默认name为有序类别,如A<B<C):
上三角(含对角线)
保留name1 <= name2的配对,包含自身配对和左上到右下的单向配对:
# dplyr方法 upper_tri <- out1 %>% filter(name1 <= name2) # base R方法 upper_tri <- out1[out1$name1 <= out1$name2, ]
上三角(不含对角线)
仅保留name1 < name2的配对:
# dplyr方法 upper_tri <- out1 %>% filter(name1 < name2) # base R方法 upper_tri <- out1[out1$name1 < out1$name2, ]
下三角(含对角线)
保留name1 >= name2的配对,包含自身配对和右上到左下的单向配对:
# dplyr方法 lower_tri <- out1 %>% filter(name1 >= name2) # base R方法 lower_tri <- out1[out1$name1 >= out1$name2, ]
下三角(不含对角线)
仅保留name1 > name2的配对:
# dplyr方法 lower_tri <- out1 %>% filter(name1 > name2) # base R方法 lower_tri <- out1[out1$name1 > out1$name2, ]
内容的提问来源于stack exchange,提问作者cwind
相关产品推荐
相关产品推荐

