我有一个很长的数据框,如下:
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)
)
## > a
## group name value
## 1 1 A 0.2
## 2 1 B 0.3
## 3 1 C 1.0
## 4 2 A 0.3
## 5 2 B 0.6
## 6 2 C 0.1
##
我想获得
name
列中的配对相关性,因此我需要获取如下数据框:
out1 <- data.frame(group=c(1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2),
name1=c('A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'),
value1=c(0.2, 0.2, 0.2, 0.3, 0.3, 0.3, 1, 1, 1, 0.3, 0.3, 0.3, 0.6, 0.6, 0.6, 0.1, 0.1, 0.1),
name2=c('A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'),
value2=c(0.2, 0.3, 1, 0.2, 0.3, 1, 0.2, 0.3, 1, 0.3, 0.6, 0.1, 0.3, 0.6, 0.1, 0.3, 0.6, 0.1)
)
## > out1
## group name1 value1 name2 value2
## 1 1 A 0.2 A 0.2
## 2 1 A 0.2 B 0.3
## 3 1 A 0.2 C 1.0
## 4 1 B 0.3 A 0.2
## 5 1 B 0.3 B 0.3
## 6 1 B 0.3 C 1.0
## 7 1 C 1.0 A 0.2
## 8 1 C 1.0 B 0.3
## 9 1 C 1.0 C 1.0
## 10 2 A 0.3 A 0.3
## 11 2 A 0.3 B 0.6
## 12 2 A 0.3 C 0.1
## 13 2 B 0.6 A 0.3
## 14 2 B 0.6 B 0.6
## 15 2 B 0.6 C 0.1
## 16 2 C 0.1 A 0.3
## 17 2 C 0.1 B 0.6
## 18 2 C 0.1 C 0.1
##
或删除重叠部分:
out2 <- data.frame(group=c(1, 1, 1, 2, 2, 2),
name1=c('A', 'A', 'B', 'A', 'A', 'B'),
value1=c(0.2, 0.2, 0.3, 0.3, 0.3, 0.6),
name2=c('B', 'C', 'C', 'B', 'C', 'C'),
value2=c(0.3, 1, 1, 0.6, 0.1, 0.1)
)
## > out2
## group name1 value1 name2 value2
## 1 1 A 0.2 B 0.3
## 2 1 A 0.2 C 1.0
## 3 1 B 0.3 C 1.0
## 4 2 A 0.3 B 0.6
## 5 2 A 0.3 C 0.1
## 6 2 B 0.6 C 0.1
##
最后我得到相关图如下:
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
,但基本R也可以)。
另外,如何得到上三角形或下三角形?
感谢您的帮助。
这依赖于
tidyr::nest()
、gtools::combinations()
和dplyr::left_join()
:
library(dplyr)
library(tidyr)
library(gtools)
library(ggplot2)
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)
) |>
nest(combos = c(name, value)) |>
mutate(
combos = lapply(combos, function(x) {
combinations(length(x$name), 2, x$name) |>
as_tibble(.name_repair = ~ c("name_1", "name_2")) |>
left_join(x, join_by(name_1 == name)) |>
rename(value_1 = value) |>
left_join(x, join_by(name_2 == name)) |>
rename(value_2 = value)
})
) |>
unnest(combos) |>
ggplot(aes(value_1, value_2, color = name_1)) +
geom_point() +
geom_smooth(method = lm, formula = y ~ x) +
facet_grid(name_2 ~ name_1)
创建于 2024-04-25,使用 reprex v2.1.0