Найти совпадения для идентификаторов и изменить данные в R - PullRequest
2 голосов
/ 02 мая 2020

У меня очень глупая проблема, которую я не знаю, как решить. У меня есть этот кадр данных в R

structure(list(IDs = c("2", "3", "4", "1", "1", "1", "4", "6", 
"2", "2", "2", "1", "4", "5", "3", "3", "3", "1", "2", "3", "6", 
"7", "5", "3", "4", "7", "8", "5", "2", "4", "7", "10", "6", 
"4", "5", "6", "10", "9", "8", "5", "7", "9", "8", "8", "7", 
"8", "9", "10", "10", "10", "9", "6", "7", "9", "10", "9", "9", 
"10"), dist = c("1", "1", "1", "1", "1", "2", "2", "2", "2", 
"2", "2", "3", "3", "3", "3", "3", "3", "4", "4", "4", "4", "4", 
"4", "5", "5", "5", "5", "5", "6", "6", "6", "6", "6", "7", "7", 
"7", "7", "7", "7", "8", "8", "8", "8", "8", "9", "9", "9", "9", 
"9", "9", "9", "10", "10", "10", "10", "10", "10", "10")), class = "data.frame", row.names = c(1L, 
2L, 3L, 4L, 5L, 10L, 11L, 12L, 13L, 14L, 16L, 19L, 20L, 21L, 
22L, 23L, 25L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 
38L, 40L, 41L, 42L, 43L, 44L, 46L, 47L, 48L, 49L, 50L, 51L, 52L, 
53L, 54L, 55L, 56L, 61L, 62L, 63L, 64L, 65L, 68L, 69L, 71L, 72L, 
73L, 75L, 76L, 77L, 79L))

Я хочу найти все совпадения для чисел в идентификаторах столбцов и создает новые столбцы с их dist. Поэтому в идеале мне нужен вывод, который выглядит следующим образом:

enter image description here

Я действительно борюсь с этим. Спасибо за помощь!

Код ответа, предложенный @akrun, работает хорошо, и результат выглядит следующим образом:

enter image description here

Идеально, когда Идентификаторы и dist имеют одно и то же значение, тогда я не хочу, чтобы этот dist добавлялся (цифры красного цвета там быть не должны)

1 Ответ

2 голосов
/ 02 мая 2020

Мы можем создать столбец последовательности и изменить его на «широкий» формат

library(dplyr)
library(tidyr)
library(stringr)
df1 %>% 
     filter(IDs != dist) %>%
     group_by(IDs = factor(IDs, levels = sort(as.integer(unique(IDs)))))%>% 
     mutate(newcol = str_c('n', row_number())) %>%
     ungroup %>%
     arrange(IDs) %>%
     pivot_wider(names_from = newcol, values_from = dist)
# A tibble: 10 x 7
#   IDs   n1    n2    n3    n4    n5    n6   
#   <fct> <chr> <chr> <chr> <chr> <chr> <chr>
# 1 1     2     3     4     <NA>  <NA>  <NA> 
# 2 2     1     4     6     <NA>  <NA>  <NA> 
# 3 3     1     4     5     <NA>  <NA>  <NA> 
# 4 4     1     2     3     5     6     7    
# 5 5     3     4     7     8     <NA>  <NA> 
# 6 6     2     4     7     10    <NA>  <NA> 
# 7 7     4     5     6     8     9     10   
# 8 8     5     7     9     <NA>  <NA>  <NA> 
# 9 9     7     8     10    10    10    <NA> 
#10 10    6     7     9     9     9     <NA> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...