Как объединить дублирующиеся строки без потери уникальных данных в R или VBA? - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть таблица в Excel, где есть уникальные столбцы, но много повторяющихся строк.Дубликаты измеряются по столбцу «uniqueID», который является электронным письмом, хранящимся в виде строки.Строки могут иметь одинаковый уникальный идентификатор, но с отсутствующими данными в других столбцах или с другими данными в одном столбце.

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

Я пробовал функцию Aggregate в R и dplyr, но безуспешно, в основном потому, что я до сих пор не уверен в том, как работают эти две функции.

Ввод:

uniqueID, favFruits, favVeggie, State, favColor
john@mail.com, NULL, carrots, CA, Green
jill@mail.com, apples, NULL, FL, NULL
john@mail.com, grapes, beets, CA, Red
jill@mail.com, cherries, beans, FL, Blue
jill@mail.com, pineapple, beans, FL, Blue 
john@mail.com, grapes, beets, CA, Yellow

Выход:

uniqueID, favFruits, favVeggie, State, favColor
john@mail.com, grapes, (carrots, beets), CA, (Green, Red, Yellow)
jill@mail.com, (apples, cherries, pineapple), beans, FL, Blue

Примечание:

«NULL» в этом смысле - просто пустая ячейка Excel.Он не называется NULL или что-то еще.Полный набор данных содержит ~ 30 столбцов и ~ 20000 строк.«()» В каждом столбце означает одну ячейку, содержащую оба значения, а не круглую скобку внутри ячейки.

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Я бы взял ответ Dave2e, сделал бы еще один шаг и удалил бы все NULL, как это:

library(tidyverse)

input <- tibble::tribble(
          ~uniqueID,  ~favFruits, ~favVeggie, ~State, ~favColor,
    "john@mail.com",      "NULL",  "carrots",   "CA",   "Green",
    "jill@mail.com",    "apples",     "NULL",   "FL",    "NULL",
    "john@mail.com",    "grapes",    "beets",   "CA",     "Red",
    "jill@mail.com",  "cherries",    "beans",   "FL",    "Blue",
    "jill@mail.com", "pineapple",    "beans",   "FL",    "Blue",
    "john@mail.com",    "grapes",    "beets",   "CA",  "Yellow"
    )


output <- input %>% 
    mutate_all(list(~str_replace(., "NULL", NA_character_))) %>% 
    group_by(uniqueID) %>% 
    summarise_all(list(~toString(unique(na.omit(.)))))

output

# A tibble: 2 x 5
  uniqueID      favFruits                   favVeggie      State favColor          
  <chr>         <chr>                       <chr>          <chr> <chr>             
1 jill@mail.com apples, cherries, pineapple beans          FL    Blue              
2 john@mail.com grapes                      carrots, beets CA    Green, Red, Yellow
0 голосов
/ 25 апреля 2019

Это прямая проблема с использованием библиотеки dplyr.Ключ заключается в группировке по уникальному идентификатору и использовании toString для объединения уникальных строк.

df<-read.table(header=TRUE, text="uniqueID favFruits favVeggie State favColor
john@mail.com NA carrots CA Green
jill@mail.com apples NA FL NA
john@mail.com grapes beets CA Red
jill@mail.com cherries beans FL Blue
jill@mail.com pineapple beans FL Blue 
john@mail.com grapes beets CA Yellow")


library(dplyr)
 answer<- df %>% group_by(uniqueID) %>% summarize_all(list(~toString(unique(.))) ) 

print(answer)
# A tibble: 2 x 5
  uniqueID      favFruits                   favVeggie      State favColor          
  <fct>         <chr>                       <chr>          <chr> <chr>             
1 jill@mail.com apples, cherries, pineapple NA, beans      FL    NA, Blue          
2 john@mail.com NA, grapes                  carrots, beets CA    Green, Red, Yellow
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...