Назначить прогрессивный идентификатор на основе двух критериев - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть две колонки об идентификаторах участников моего исследования.Столбец ID содержит прогрессивный порядок чисел, поскольку все субъекты были разными людьми.Второй столбец new_ID содержит информацию о том, какие идентификаторы соответствуют одному и тому же лицу.К сожалению, они не в прогрессивном порядке.

ID <- c(1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6)
new_ID <- c(8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 10, 10, 10, 10, 10, 10, 10)

data.frame(ID, new_ID)

#   ID  new_ID
#1   1       8
#2   1       8
#3   1       8
#4   1       8
#5   2      10
#6   2      10
#7   2      10
#8   2      10
#9   2      10
#10  2      10
#11  3       8
#12  3       8
#13  3       8
#14  3       8
#15  3       8
#16  4       4
#17  4       4
#18  4       4
#19  4       4
#20  4       4
#21  4       4
#22  5       5
#23  5       5
#24  5       5
#25  5       5
#26  6      10
#27  6      10
#28  6      10
#29  6      10
#30  6      10
#31  6      10
#32  6      10

Я сообщил ниже о том, чего я хотел бы достичь, то есть назначить новый идентификатор (final_ID) на основе информации в двух первых столбцах.Любая помощь будет оценена (лучше всего при использовании dplyr)!


#   ID new_ID ID_final
#1   1      8        1
#2   1      8        1
#3   1      8        1
#4   1      8        1
#5   2     10        2
#6   2     10        2
#7   2     10        2
#8   2     10        2
#9   2     10        2
#10  2     10        2
#11  3      8        1
#12  3      8        1
#13  3      8        1
#14  3      8        1
#15  3      8        1
#16  4      4        4
#17  4      4        4
#18  4      4        4
#19  4      4        4
#20  4      4        4
#21  4      4        4
#22  5      5        5
#23  5      5        5
#24  5      5        5
#25  5      5        5
#26  6     10        2
#27  6     10        2
#28  6     10        2
#29  6     10        2
#30  6     10        2
#31  6     10        2
#32  6     10        2

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Вот и решение data.table.

РЕДАКТИРОВАТЬ: добавлено решение dplyr также по запросу OP.

library(data.table)
ID <- c(1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6)
new_ID <- c(8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 10, 10, 10, 10, 10, 10, 10)

d <- data.table(ID, new_ID)
d[, ID_final := min(.SD[,ID]), new_ID]
d
#>     ID new_ID ID_final
#>  1:  1      8        1
#>  2:  1      8        1
#>  3:  1      8        1
#>  4:  1      8        1
#>  5:  2     10        2
#>  6:  2     10        2
#>  7:  2     10        2
#>  8:  2     10        2
#>  9:  2     10        2
#> 10:  2     10        2
#> 11:  3      8        1
#> 12:  3      8        1
#> 13:  3      8        1
#> 14:  3      8        1
#> 15:  3      8        1
#> 16:  4      4        4
#> 17:  4      4        4
#> 18:  4      4        4
#> 19:  4      4        4
#> 20:  4      4        4
#> 21:  4      4        4
#> 22:  5      5        5
#> 23:  5      5        5
#> 24:  5      5        5
#> 25:  5      5        5
#> 26:  6     10        2
#> 27:  6     10        2
#> 28:  6     10        2
#> 29:  6     10        2
#> 30:  6     10        2
#> 31:  6     10        2
#> 32:  6     10        2
#>     ID new_ID ID_final

library(dplyr)
df <- data.frame(ID, new_ID)
df <- df %>% group_by(new_ID)  %>%
  mutate(ID_final = min(ID))
df
#> # A tibble: 32 x 3
#> # Groups:   new_ID [4]
#>       ID new_ID ID_final
#>    <dbl>  <dbl>    <dbl>
#>  1     1      8        1
#>  2     1      8        1
#>  3     1      8        1
#>  4     1      8        1
#>  5     2     10        2
#>  6     2     10        2
#>  7     2     10        2
#>  8     2     10        2
#>  9     2     10        2
#> 10     2     10        2
#> # ... with 22 more rows

Создано в 2019-09-30 пакетом Представить (v0.3.0)

0 голосов
/ 27 сентября 2019

Что вы хотите сделать, это найти правильный идентификатор для каждого new_ID, а затем присоединиться к этому сопоставлению.

final_id_map <- df %>% group_by(new_ID) %>% summarise(ID_final=min(ID))
> final_id_map
# A tibble: 4 x 2
  new_ID ID_final
   <dbl>    <dbl>
1      4        4
2      5        5
3      8        1
4     10        2

Затем вы можете просто сделать

df %>% join(final_id_map)

, чтобы произвестижелаемый вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...