Генерация нескольких столбцов для сортировки данных в R - PullRequest
0 голосов
/ 13 октября 2018

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

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;Имя3, Код3, R3 ...

1 Ответ

0 голосов
/ 14 октября 2018

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

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 хотел бы, чтобы первый набор столбцов повторялся для всех строк, а 2-й и 3-й появления отображались в той строке, в которой они изначальнопоявился в.

Вот подход, использующий 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
...