Как удалить строки в R, который содержит тот же «набор» данных в столбце - PullRequest
0 голосов
/ 08 мая 2018

У меня есть датафрейм с двумя столбцами lift и skill.set.В пределах skill.set содержит строку навыков, разделенных запятыми.Например, в строке «Excel, PowerPoint» может быть одна запись, а в другой - «PowerPoint, Excel».Эти два наблюдения собирают одни и те же данные, и я хочу сохранить только одно из них (то, которое имеет самый высокий подъем).Я не могу придумать эффективный способ сделать это без наивного превращения каждой строки в вектор с элементами, разделенными запятой, а затем написания цикла for, который сравнивает каждые skill.set данные друг с другом skill.set данные.

Пример кадра данных:

df = structure(list(lift = c(5.71421247789905, 4.65329289252856, 5.87820023244231, 
21.1815668998877), skill.set = c("JavaScript,Microsoft.Excel..MS.Excel.,Microsoft.Word,Python,Microsoft.PowerPoint", 
"Microsoft.PowerPoint,Microsoft.Word,Python,SQL,Microsoft.Excel..MS.Excel.", 
"Microsoft.Excel..MS.Excel.,Microsoft.Word,Python,SQL,Microsoft.PowerPoint", 
"Analytics...Text.Mining,Natural.Language.Processing,Python")), .Names = c("lift", 
"skill.set"), row.names = 239:242, class = "data.frame")

Требуемый кадр данных:

structure(list(lift = c(5.71421247789905, 5.87820023244231, 21.1815668998877
), skill.set = c("JavaScript,Microsoft.Excel..MS.Excel.,Microsoft.Word,Python,Microsoft.PowerPoint", 
"Microsoft.Excel..MS.Excel.,Microsoft.Word,Python,SQL,Microsoft.PowerPoint", 
"Analytics...Text.Mining,Natural.Language.Processing,Python")), .Names = c("lift", 
"skill.set"), row.names = c(239L, 241L, 242L), class = "data.frame")

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вот еще одно решение с использованием dplyr и tidyr.

df %>%
  separate_rows(skill.set, sep = ",") %>%
  group_by(lift) %>%
  arrange(skill.set) %>%
  mutate(id = row_number()) %>%
  spread(id, skill.set) %>%
  unite(skill.set, 2:6, sep = ",") %>%
  group_by(skill.set) %>%
  summarise_at(vars(lift), max)

Вы решаете, какой lift вы хотите оставить, изменив max на то, что вы предпочитаете. Кроме того, измените 2:6 на основе номеров столбцов, которые были созданы предыдущим spread.

0 голосов
/ 08 мая 2018

Мы можем сделать следующее:

df[!duplicated(sapply(strsplit(df$skill.set, ","), function(x) 
    paste0(sort(x), collapse = ","))), ]
#         lift
#239  5.714212
#240  4.653293
#242 21.181567
#                                                                           skill.set
#239 JavaScript,Microsoft.Excel..MS.Excel.,Microsoft.Word,Python,Microsoft.PowerPoint
#240        Microsoft.PowerPoint,Microsoft.Word,Python,SQL,Microsoft.Excel..MS.Excel.
#242                       Analytics...Text.Mining,Natural.Language.Processing,Python

Объяснение: Разделить записи в df$skill.set на ",", затем отсортировать записи и объединить; хранить только недублированные записи.


Обновление

Чтобы сохранить только строку с наибольшим значением lift, мы можем использовать aggregate:

setNames(aggregate(
    lift ~ sapply(strsplit(skill.set, ","), function(x) paste0(sort(x), collapse = ",")),
    df,
    max), rev(names(df)))
#1                       Analytics...Text.Mining,Natural.Language.Processing,Python
#2 JavaScript,Microsoft.Excel..MS.Excel.,Microsoft.PowerPoint,Microsoft.Word,Python
#3        Microsoft.Excel..MS.Excel.,Microsoft.PowerPoint,Microsoft.Word,Python,SQL
#       lift
#1 21.181567
#2  5.714212
#3  5.878200
...