我找到了this casethis other,但它们不能完全回答我的问题.

Input data个是宽格式的:

dat0
    # A tibble: 5 × 6
         id gp       a1    a2    a3    a4
      <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
    1     1 A         2    10   150  1000
    2     2 B         4    20   200  3000
    3     3 C         7    30   350  4000
    4     4 D         8    40   400  7000
    5     5 E         9    50   700  8000  

dat0 <-
structure(list(id = c(1, 2, 3, 4, 5), gp = c("A", "B", "C", "D", 
"E"), a1 = c(2, 4, 7, 8, 9), a2 = c(10, 20, 30, 40, 50), a3 = c(150, 
200, 350, 400, 700), a4 = c(1000, 3000, 4000, 7000, 8000)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -5L)) 

如何将多个列透视为两个列axay,以便:

  • 表示初始列a1a4的所有组合,
  • 两个初始的第一列(这里是idgp,作为例子给出)被复制与可能的组合一样多的次数,
  • 创建新的列ax_vs_ay以对组合进行分类.

Desired output data:

print(dat1, n=30)
# A tibble: 30 × 5
      id gp    ax_vs_ay    ax    ay
   <dbl> <chr> <chr>    <dbl> <dbl>
 1     1 A     a1_vs_a2     2    10
 2     2 B     a1_vs_a2     4    20
 3     3 C     a1_vs_a2     7    30
 4     4 D     a1_vs_a2     8    40
 5     5 E     a1_vs_a2     9    50
 6     1 A     a1_vs_a3     2   150
 7     2 B     a1_vs_a3     4   200
 8     3 C     a1_vs_a3     7   350
 9     4 D     a1_vs_a3     8   400
10     5 E     a1_vs_a3     9   700
11     1 A     a1_vs_a4     2  1000
12     2 B     a1_vs_a4     4  3000
13     3 C     a1_vs_a4     7  4000
14     4 D     a1_vs_a4     8  7000
15     5 E     a1_vs_a4     9  8000
16     1 A     a2_vs_a3    10   150
17     2 B     a2_vs_a3    20   200
18     3 C     a2_vs_a3    30   350
19     4 D     a2_vs_a3    40   400
20     5 E     a2_vs_a3    50   700
21     1 A     a2_vs_a4    10  1000
22     2 B     a2_vs_a4    20  3000
23     3 C     a2_vs_a4    30  4000
24     4 D     a2_vs_a4    40  7000
25     5 E     a2_vs_a4    50  8000
26     1 A     a3_vs_a4   150  1000
27     2 B     a3_vs_a4   200  3000
28     3 C     a3_vs_a4   350  4000
29     4 D     a3_vs_a4   400  7000
30     5 E     a3_vs_a4   700  8000  

谢谢你的帮助

推荐答案

这可能是最简单的理解,即对较长格式的数据进行self 联接+一些重新标记.

dat0_long <- dat0 |> pivot_longer(-(1:2))

dat0_long |>
  inner_join(dat0_long, join_by(id, gp, name < name)) |>
  mutate(id, gp, ax_vs_ay = paste0(name.x, "_vs_", name.y),
         ax = value.x, ay = value.y, .keep = "none")

结果

# A tibble: 30 × 5
      id gp    ax_vs_ay    ax    ay
   <dbl> <chr> <chr>    <dbl> <dbl>
 1     1 A     a1_vs_a2     2    10
 2     1 A     a1_vs_a3     2   150
 3     1 A     a1_vs_a4     2  1000
 4     1 A     a2_vs_a3    10   150
 5     1 A     a2_vs_a4    10  1000
 6     1 A     a3_vs_a4   150  1000
 7     2 B     a1_vs_a2     4    20
 8     2 B     a1_vs_a3     4   200
 9     2 B     a1_vs_a4     4  3000
10     2 B     a2_vs_a3    20   200
11     2 B     a2_vs_a4    20  3000
12     2 B     a3_vs_a4   200  3000
13     3 C     a1_vs_a2     7    30
14     3 C     a1_vs_a3     7   350
15     3 C     a1_vs_a4     7  4000
16     3 C     a2_vs_a3    30   350
17     3 C     a2_vs_a4    30  4000
18     3 C     a3_vs_a4   350  4000
19     4 D     a1_vs_a2     8    40
20     4 D     a1_vs_a3     8   400
21     4 D     a1_vs_a4     8  7000
22     4 D     a2_vs_a3    40   400
23     4 D     a2_vs_a4    40  7000
24     4 D     a3_vs_a4   400  7000
25     5 E     a1_vs_a2     9    50
26     5 E     a1_vs_a3     9   700
27     5 E     a1_vs_a4     9  8000
28     5 E     a2_vs_a3    50   700
29     5 E     a2_vs_a4    50  8000
30     5 E     a3_vs_a4   700  8000

R相关问答推荐

带有gplot 2的十字舱口

单击 map 后,将坐标复制到剪贴板

有没有一种方法可以从函数中创建一个值的列表,然后将这些值变成R中的直方图?我一直觉得不行

从开始时间和结束时间导出时间

R for循环返回到先前值

如何写一个R函数来旋转最后n分钟?

当月份额减go 当月份额

如何在R中合并两个基准点?

是否可以创建一个ggplot与整洁判断的交互作用

如何编辑gMarginal背景以匹配绘图背景?

一小时满足条件的日期的 Select

在R中使用Scale_y_Break后更改y轴标签

为什么我使用geom_density的绘图不能到达x轴?

根据纬度和距离连接两个数据集

WRS2包中带有bwtrim的简单ANOVA抛出错误

为什么这个表格格罗布不打印?

如何判断代码是否在R Markdown(RMD)上下文中交互运行?

ArrangeGrob()和类似的替代方法不接受Grob列表.在Grid.Draw,返回:glist中的错误(...):仅允许在glist";中使用Grobs;

替换在以前工作的代码中有x行&q;错误(geom_sf/gganimate/dow_mark)

臭虫?GradeThis::grade_this_code()在`-code-check`块中失败