Генерация нескольких столбцов для сортировки данных в R

У меня есть база данных, включающая имена, коды и номера следующим образом:

Name1 Code1 R1
A A 12 1
A B 13 2
A C 15 5
A B 8 4
A C 13 2
A D 17 1
A B 16 7

Я хочу создать столбцы для повторяющихся имен, как это:

Name1 Code1 R1 Name2 Code2  R2 Name3 Cod3 R3
A A 12 1      
A B 13 2      
A C 15 5      
A B 8 4 A B 8 4   
A C 13 2 A C 13 2   
A D 17 1      
A B 16 7    A B 16 7

Я гуглил, чтобы найти решение, но я не мог найти, или, может быть, я что-то пропустил. Возможно ли вам помочь мне. Некоторые имена (Name1) были повторены 5 раз, и я не добавил их. Так что у меня есть Name2 Code2 R2; Name3, Code3, R3...

1 ответ

Решение

Пример данных:

df <- read.table(stringsAsFactors = F, header = T,  text = "
Name1a Name1b   Code1   R1
1 A A   12  1
2 A B   13  2
3 A C   15  5
4 A B   8   4
5 A C   13  2
6 A D   17  1
7 A B   16  7") %>%
  tidyr::unite(Name1, Name1a, Name1b)

Редактировать: исходный ответ был в упакованном формате, но OP хотел бы, чтобы первый набор столбцов повторялся для всех строк, а второй и третий появления отображались в той строке, в которой они изначально отображались.

Вот подход с использованием dplyr а также tidyr,

# Keep track of original rows, label repeats, and make it long format
df_order <- df %>% 
  mutate(orig_row = row_number()) %>%
  group_by(Name1) %>% mutate(repeat_no = row_number()) %>% ungroup() %>%
  gather(col_type, value, Code1:R1)

# Make one copy of all the rows to keep in first column
df_ones <- df_order %>%
  mutate(repeat_no = 1) %>%
  unite(col_rpt, repeat_no, col_type)

# Get the repeated rows to add on
df_repeats <- df_order %>%
  filter(repeat_no > 1) %>%
  unite(col_rpt, repeat_no, col_type)

# Combine the two and spread out
output <- df_ones %>%
  bind_rows(df_repeats) %>%
  spread(col_rpt, value) %>%
  arrange(orig_row) %>%
  select(-orig_row)

Выход:

> output
# A tibble: 7 x 7
  Name1 `1_Code1` `1_R1` `2_Code1` `2_R1` `3_Code1` `3_R1`
  <chr>     <int>  <int>     <int>  <int>     <int>  <int>
1 A_A          12      1        NA     NA        NA     NA
2 A_B          13      2        NA     NA        NA     NA
3 A_C          15      5        NA     NA        NA     NA
4 A_B           8      4         8      4        NA     NA
5 A_C          13      2        13      2        NA     NA
6 A_D          17      1        NA     NA        NA     NA
7 A_B          16      7        NA     NA        16      7
Другие вопросы по тегам