Консолидация нескольких записей на ячейку из 2 столбцов в R - PullRequest
1 голос
/ 29 апреля 2020

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

Вот мои данные на данный момент:

ID  Name(s) Number(s) ...
#1  X, Y    123, 456
#2  Z       789
#3  Y, Z    456, 789
#4  W       0
...

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

Name  Number
W     0
X     123
Y     456
Z     789

Одно и то же число всегда соответствует одному и тому же имени, у меня просто нет чистой версии этих данных. Я бы оценил вашу помощь!

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Мы можем использовать separate_rows для получения значений через запятую в разных строках, arrange данных и выбирать только уникальные строки с distinct.

library(dplyr)

df %>%
  tidyr::separate_rows(Name, Number, sep = ",") %>%
  select(-ID) %>%
  arrange_all() %>%
  distinct()

#  Name Number
#1    W      0
#2    X    123
#3    Y    456
#4    Z    789

данные

df <- structure(list(ID = 1:4, Name = c("X,Y", "Z", "Y,Z", "W"), 
      Number = c("123,456", "789", "456,789", "0")), 
      class = "data.frame", row.names = c(NA, -4L))
0 голосов
/ 30 апреля 2020

Мы можем использовать cSplit для разделения данных в «длинный» формат

library(splitstackshape)
library(data.table)
unique(cSplit(df, c("Name", "Number"), ",", "long")[order(Name, Number),
     .(Name, Number)])
#   Name Number
#1:    W      0
#2:    X    123
#3:    Y    456
#4:    Z    789

data

df <- structure(list(ID = 1:4, Name = c("X,Y", "Z", "Y,Z", "W"), 
      Number = c("123,456", "789", "456,789", "0")), 
      class = "data.frame", row.names = c(NA, -4L))
...