1) pivot_longer Вставьте столбец A2
, все строки которого содержат слово Total
, а затем измените его с широкой на длинную форму, используя pivot_longer
. Это также создаст столбец name
, который нам не нужен, поэтому удалите его.
library(dplyr)
library(tidyr)
test %>%
mutate(A2 = "Total") %>%
pivot_longer(starts_with("A"), values_to = "ARMCD") %>%
select(-name)
, что дает:
# A tibble: 16 x 3
SUBJID SITEID ARMCD
<chr> <int> <chr>
1 102-S0001 102 SER401_A
2 102-S0001 102 Total
3 102-S0002 102 SER401_A
4 102-S0002 102 Total
5 102-S0003 102 SER401_P
6 102-S0003 102 Total
7 102-S0005 102 SER401_A
8 102-S0005 102 Total
9 102-S0006 102 SER401_A
10 102-S0006 102 Total
11 107-S0002 107 SER401_A
12 107-S0002 107 Total
13 108-S0002 108 SER401_A
14 108-S0002 108 Total
15 108-S0004 108 SER401_P
16 108-S0004 108 Total
1a) unnest Другой способиспользуйте dplyr / tidyr для замены столбца ARMCD
списком, каждый элемент которого представляет собой двухвекторный элемент, состоящий из элемента ARMCD
, за которым следует компонент, равный «Всего». Затем unnest
that.
library(dplyr)
library(tidyr)
test %>%
rowwise %>%
mutate(ARMCD = list(c(ARMCD, "Total"))) %>%
ungroup %>%
unnest(ARMCD)
, что дает:
# A tibble: 16 x 3
SUBJID SITEID ARMCD
<chr> <int> <chr>
1 102-S0001 102 SER401_A
2 102-S0001 102 Total
3 102-S0002 102 SER401_A
4 102-S0002 102 Total
5 102-S0003 102 SER401_P
6 102-S0003 102 Total
7 102-S0005 102 SER401_A
8 102-S0005 102 Total
9 102-S0006 102 SER401_A
10 102-S0006 102 Total
11 107-S0002 107 SER401_A
12 107-S0002 107 Total
13 108-S0002 108 SER401_A
14 108-S0002 108 Total
15 108-S0004 108 SER401_P
16 108-S0004 108 Total
2) Base R Определить функцию dup
, которая принимает индекс строки и возвращаетстрока дублируется, но с Total
во втором ряду. sapply
для каждой строки и rbind
результатов вместе.
dup <- function(i) {
test <- test[c(i, i), ]
test$ARMCD[2] <- "Total"
test
}
do.call("rbind", lapply(1:nrow(test), dup))
, дающих:
SUBJID SITEID ARMCD
1 102-S0001 102 SER401_A
1.1 102-S0001 102 Total
2 102-S0002 102 SER401_A
2.1 102-S0002 102 Total
3 102-S0003 102 SER401_P
3.1 102-S0003 102 Total
4 102-S0005 102 SER401_A
4.1 102-S0005 102 Total
5 102-S0006 102 SER401_A
5.1 102-S0006 102 Total
6 107-S0002 107 SER401_A
6.1 107-S0002 107 Total
7 108-S0002 108 SER401_A
7.1 108-S0002 108 Total
8 108-S0004 108 SER401_P
8.1 108-S0004 108 Total
Примечание
Предполагается, что ввод в воспроизводимом видебыть:
Lines <- "
SUBJID SITEID ARMCD
1 102-S0001 102 SER401_A
2 102-S0002 102 SER401_A
3 102-S0003 102 SER401_P
4 102-S0005 102 SER401_A
5 102-S0006 102 SER401_A
6 107-S0002 107 SER401_A
7 108-S0002 108 SER401_A
8 108-S0004 108 SER401_P"
test <- read.table(text = Lines, as.is = TRUE)