如何从R中的长数据帧中获取“1对1”相关数据帧

问题描述 投票:0回答:1

我有一个很长的数据框,如下:

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也可以)。

另外,如何得到上三角形或下三角形?

感谢您的帮助。

r dplyr
1个回答
0
投票

这依赖于

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

© www.soinside.com 2019 - 2024. All rights reserved.