Упорядочить список слов в один столбец R

У меня есть выходной фрейм данных из априори, правила, как указано ниже:

rules
{A,B} => {C}
{C,A} => {B}
{A,B} => {D}
{A,D} => {B}
{A,B} => {E}
{E,A} => {B}

До этого момента я сгруппировал элементы в каждом правиле (data.frame - это df_basket)

rules           basket
{A,B} => {C}    A,B,C
{C,A} => {B}    C,A,B
{A,B} => {D}    A,B,D
{A,D} => {B}    A,D,B
{A,B} => {E}    A,B,E
{E,A} => {B}    E,A,B

Я хочу иметь возможность заказывать корзину в алфавитном порядке, как указано ниже:

rules           basket  Group
{A,B} => {C}    A,B,C   A,B,C
{C,A} => {B}    C,A,B   A,B,C
{A,B} => {D}    A,B,D   A,B,D
{A,D} => {B}    A,D,B   A,B,D
{A,B} => {E}    A,B,E   A,B,E
{E,A} => {B}    E,A,B   A,B,E

Я использовал приведенный ниже код, который отлично работает для небольших фреймов данных и выполняет свою работу. Цикл for неэффективен для больших фреймов данных. Пожалуйста, помогите мне оптимизировать эту атомарную операцию в R:

for(i in 1:nrow(df_basket))
{
  df_basket$Basket[i]<- ifelse(1==1,paste(unlist(strsplit(df_basket$basket[i],","))
                                          [order(unlist(strsplit(df_basket$basket[i],",")))],collapse = ","))

} 

Пожалуйста, дайте мне знать, если есть что-нибудь более простое или более прямое, чтобы получить поле «Группа» моего фрейма данных.

Пожалуйста, предоставьте свои входные данные в воспроизводимой форме, например, используя dput(head(df_basket)).

talat 22.03.2018 14:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
78
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Попробуйте адаптировать это решение:

f<-function(x)
{
  sorted<-sort(unlist(strsplit(x,",")))
  return(paste0(sorted,collapse = ","))

}
cbind(basket,unlist(lapply(basket,f)))

Входные данные:

basket<-c("A,B,C","C,A,B","A,B,D","A,D,B","A,B,E","E,A,B")

Выход:

     basket         
[1,] "A,B,C" "A,B,C"
[2,] "C,A,B" "A,B,C"
[3,] "A,B,D" "A,B,D"
[4,] "A,D,B" "A,B,D"
[5,] "A,B,E" "A,B,E"
[6,] "E,A,B" "A,B,E"

Да! Это работает. Спасибо. Я тестировал его на 10К, и он работает намного быстрее, чем цикл for. Я пробую это сейчас на 3M, и это займет некоторое время.

SatZ 22.03.2018 14:25

Пожалуйста, lapply лучше, чем цикл for, но с 3M строками это займет несколько минут.

Terru_theTerror 22.03.2018 14:29

Это заняло менее 5 минут и определенно является гораздо лучшей альтернативой, чем цикл for. Большое спасибо

SatZ 22.03.2018 14:31

Вот еще один способ использования дополнительной поддержки со стороны arules:

### create some random data and mine rules
library("arules")
dat <- replicate(10, sample(LETTERS[1:5], size = 3), simplify = FALSE)
trans <- as(dat, "transactions")
rules <- apriori(trans)
inspect(rules)

    lhs      rhs support confidence lift     count
[1] {}    => {A} 0.8     0.8        1.000000 8    
[2] {B}   => {A} 0.6     1.0        1.250000 6    
[3] {C,D} => {E} 0.2     1.0        1.428571 2    
[4] {B,D} => {A} 0.1     1.0        1.250000 1    
[5] {B,C} => {A} 0.2     1.0        1.250000 2    
[6] {B,E} => {A} 0.3     1.0        1.250000 3   

### Get the itemsets that generated each rule and convert the itemsets 
### into a list. I use a list, since in gerneral, rules will not all 
### have the same number of items.
itemsets <- as(items(generatingItemsets(rules)), "list")

### sort the item labels alphabetically. Note that you could already 
### start with the item labels correctly sorted in the transaction set
### (see manual page for itemcoding in arules).
lapply(itemsets, sort)

[[1]]
[1] "A"

[[2]]
[1] "A" "B"

[[3]]
[1] "C" "D" "E"

[[4]]
[1] "A" "B" "D"

[[5]]
[1] "A" "B" "C"

[[6]]
[1] "A" "B" "E"

Если все правила имеют одинаковое количество элементов, вы можете поместить этот список в матрицу.

Если вы хотите, чтобы они были одной строкой, вы можете сделать:

sapply(lapply(itemsets, sort), paste0, collapse = ",")
[1] "A"     "A,B"   "C,D,E" "A,B,D" "A,B,C" "A,B,E"

Другие вопросы по теме