Отдельные значения в столбце фрейма данных и расплавление

#r #string-split #melt

#r #разделить #расплавить

Вопрос:

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

 > head(df)
  Account.Owner       Account.Name                   Client.ID
1    Deb Berman     Albertsons LLC      3184, 3186, 3185, 2578
2    Deb Berman        All Recipes                   909, 4937
3    Liz Madsen   American Express                   1230,1236
4    Deb Berman  Bed Bath amp; Beyond                  1180, 1556
5    Deb Berman           Birchbox 101, 1704, 5149, 5150, 5148
6   Jeff Murphy Brown Shoe Company            5402, 6159, 6160
  

В конце я хочу, чтобы это выглядело так

 Account.Owner       Account.Name                   Client.ID
    1    Deb Berman     Albertsons LLC                  3184  
    2    Deb Berman     Albertsons LLC                  3186
    3    Deb Berman     Albertsons LLC                  3185
  

Спасибо.

Комментарии:

1. 3185 Клиент. Идентификатор принадлежит Деб Берман, нет?

Ответ №1:

Я бы предложил мою cSplit функцию для решения подобной проблемы. Решение становится:

 cSplit(mydf, "Client.ID", ",", "long")
#     Account.Owner       Account.Name Client.ID
#  1:    Deb Berman     Albertsons LLC      3184
#  2:    Deb Berman     Albertsons LLC      3186
#  3:    Deb Berman     Albertsons LLC      3185
#  4:    Deb Berman     Albertsons LLC      2578
#  5:    Deb Berman        All Recipes       909
#  6:    Deb Berman        All Recipes      4937
#  7:    Liz Madsen   American Express      1230
#  8:    Liz Madsen   American Express      1236
#  9:    Deb Berman  Bed Bath amp; Beyond      1180
# 10:    Deb Berman  Bed Bath amp; Beyond      1556
# 11:    Deb Berman           Birchbox       101
# 12:    Deb Berman           Birchbox      1704
# 13:    Deb Berman           Birchbox      5149
# 14:    Deb Berman           Birchbox      5150
# 15:    Deb Berman           Birchbox      5148
# 16:   Jeff Murphy Brown Shoe Company      5402
# 17:   Jeff Murphy Brown Shoe Company      6159
# 18:   Jeff Murphy Brown Shoe Company      6160
  

Здесь используются следующие аргументы: (1) data.frame или data.table для работы, (2) столбец или столбцы, которые необходимо разделить, (3) разделитель и (4) должен ли результат быть «широким» или «длинным».

Вы можете захотеть изменить это следующим образом: cSplit(mydf, "Client.ID", ", ", "long") или cSplit(mydf, "Client.ID", ",|,\s ", "long", fixed = FALSE) в зависимости от того, насколько хорош и чист ваш «Клиент.Столбец «ID» действительно есть.

Предполагается, что мы начинаем со следующего образца набора данных:

 mydf <- structure(list(Account.Owner = c("Deb Berman", "Deb Berman", 
   "Liz Madsen", "Deb Berman", "Deb Berman", "Jeff Murphy"), 
   Account.Name = c("Albertsons LLC", "All Recipes", "American Express", 
   "Bed Bath amp; Beyond", "Birchbox", "Brown Shoe Company"), 
   Client.ID = c("3184, 3186, 3185, 2578", "909, 4937", "1230,1236", 
   "1180, 1556", "101, 1704, 5149, 5150, 5148", "5402, 6159, 6160")), 
   .Names = c("Account.Owner", "Account.Name", "Client.ID"), 
   class = c("data.table", "data.frame"), row.names = c(NA, -6L))
  

Комментарии:

1. 1 очень полезная функция — я должен начать ее использовать 🙂