Код R для идентификации одинаковых символов в имени и объединения значений столбца - PullRequest
0 голосов
/ 01 марта 2019

У меня есть столбец Кандидат, и есть различные случаи, когда имена Кандидатов совпадают, но находятся в разных строках, так как они различаются строчными и прописными буквами, пробелами или символами.Я хочу найти все эти дублированные строки с одним и тем же именем кандидата и сделать его одной строкой.Например: здесь, поскольку Хопингсон и А.С. Хопингсон находятся в двух разных строках, поэтому из AS Hopingson я хочу скопировать три столбца в As Hopingson и удалить строку с кандидатом А.С. Хопингсона.

enter image description here

1 Ответ

0 голосов
/ 01 марта 2019

Я думаю, что основная проблема заключается в том, чтобы решить, какое значение оставить в случае, если у вас есть разные значения в отдельных строках для одного и того же кандидата (хотя в вашем примере это не так).В обоих моих предложениях используется tidyverse.

Первое решение, которое приходит мне в голову, - это выбрать строку с наименьшим количеством пропущенных значений в качестве допустимой записи:

(data <- tibble(name = c("A.S. Hopingson",  "a.S. Hopingson",  "A.S.Hopingson"),
               var_1 = c(1, 2, NA),
               var_2 = c(1, NA, NA)))

# A tibble: 3 x 3
  name           var_1 var_2
  <chr>          <dbl> <dbl>
1 A.S. Hopingson     1     1
2 a.S. Hopingson     2    NA
3 A.S.Hopingson     NA    NA

data %>%
  mutate(name_new = str_replace_all(str_to_lower(name), "[^[:alpha:]]", ""), # create name that consists only of letters
         missing = rowSums(is.na(.))) %>% # count missing values per row
  arrange(name_new, missing) %>% # arrange by missing values
  group_by(name_new) %>%
  filter(row_number() == 1) %>% # filter for first row (i.e. that with lowest number of missing values
  ungroup() %>%
  select(-name_new, -missing)

# A tibble: 1 x 3
  name           var_1 var_2
  <chr>          <dbl> <dbl>
1 A.S. Hopingson     1     1

Каккак видите, значение 2 для var_1[2] сброшено.В качестве альтернативы, вы можете выбрать первое не пропущенное значение для каждой переменной и объединить эти строки:

(data <- tibble(name = c("A.S. Hopingson",  "a.S. Hopingson",  "A.S.Hopingson"),
                var_1 = c(1, 1, NA),
                var_2 = c(NA, 2, NA)))

# A tibble: 3 x 3
  name           var_1 var_2
  <chr>          <dbl> <dbl>
1 A.S. Hopingson     1    NA
2 a.S. Hopingson     1     2
3 A.S.Hopingson     NA    NA

data %>%
  mutate(name_new = str_replace_all(str_to_lower(name), "[^[:alpha:]]", "")) %>%
  select(-name) %>%
  gather(key, value, -name_new) %>%
  unique() %>%
  filter(!is.na(value)) %>%
  group_by(name_new, key) %>%
  filter(row_number() == 1) %>%
  ungroup() %>%
  spread(key, value)

# A tibble: 1 x 3
  name_new    var_1 var_2
  <chr>       <dbl> <dbl>
1 ashopingson     1     2

В случае, если вам нужны записи из обеих строк (например, потому что они оба являются правильными), вам придется вложитьваши данные или объединить значения в одну строку.

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