首页 > 解决方案 > 通过使用管道复制和替换变量来扩展 R 中的数据框

问题描述

我想使用以下方式扩展数据框:

GX将被三个不同的变量替换Gs = (G4, G5, G6)什么都将保留GX. 对于每个新行,必须复制Gs当前行,并将名称替换为相应的名称。GXGXGs

  set.seed(123)
  df = data.frame(
    "id" = c(rep("G1", 3), rep("G2", 3), rep("G3", 3), rep("GX",3)),
    "subgroup" = rep(c(1,2,3), 4),
    "total" = sample.int(n = 12),
    "C1" = sample.int(n=12),
    "C2" = sample.int(n=12),
    "C3" = sample.int(n=12))

   id subgroup total C1 C2 C3
1  G1        1     3 11  9  9
2  G1        2    12  5  3 12
3  G1        3    10  3  4 10
4  G2        1     2  9  1  7
5  G2        2     6  4 11  3
6  G2        3    11  1  7  4
7  G3        1     5  7  5  5
8  G3        2     4 12 10  6
9  G3        3     9 10  8  8
10 GX        1     8  2  2  2
11 GX        2     1  6 12  1
12 GX        3     7  8  6 11

我有一个解决方案,其中包括for loop

  Gs = c("G4", "G5", "G6")
  for (ii in 1:length(Gs)) {
    tmp.df <- df[df$id == "GX",]
    tmp.df$id <- gsub(
      pattern = "GX", 
      replacement = Gs[ii],
      x = tmp.df$id
    )
    df <- rbind(df, tmp.df)
  }
  df = df[df$id != "GX",]

这使:

id subgroup total C1 C2 C3
1   G1        1     3 11  9  9
2   G1        2    12  5  3 12
3   G1        3    10  3  4 10
4   G2        1     2  9  1  7
5   G2        2     6  4 11  3
6   G2        3    11  1  7  4
7   G3        1     5  7  5  5
8   G3        2     4 12 10  6
9   G3        3     9 10  8  8
101 G4        1     8  2  2  2
111 G4        2     1  6 12  1
121 G4        3     7  8  6 11
102 G5        1     8  2  2  2
112 G5        2     1  6 12  1
122 G5        3     7  8  6 11
103 G6        1     8  2  2  2
113 G6        2     1  6 12  1
123 G6        3     7  8  6 11

但是,我想将解决方案包含在管道中并避免for loop解决方案。是否有更多使用tidyverse 语法的 R 时尚方法包含在管道中?

谢谢

标签: rpipetidyverse

解决方案


我们只能选择其中的行id == 'GX',创建它的所有组合Gs并将原始数据框绑定到它删除'Gx'行。

library(dplyr)

df %>%
  filter(id == 'GX') %>%
  tidyr::crossing(Gs) %>%
  select(-id, id = Gs) %>%
  bind_rows(df, .) %>%
  filter(id != 'GX')


#   id subgroup total C1 C2 C3
#1  G1        1     3 11  9  9
#2  G1        2    12  5  3 12
#3  G1        3    10  3  4 10
#4  G2        1     2  9  1  7
#5  G2        2     6  4 11  3
#6  G2        3    11  1  7  4
#7  G3        1     5  7  5  5
#8  G3        2     4 12 10  6
#9  G3        3     9 10  8  8
#10 G4        1     8  2  2  2
#11 G5        1     8  2  2  2
#12 G6        1     8  2  2  2
#13 G4        2     1  6 12  1
#14 G5        2     1  6 12  1
#15 G6        2     1  6 12  1
#16 G4        3     7  8  6 11
#17 G5        3     7  8  6 11
#18 G6        3     7  8  6 11

推荐阅读