Редактирование фрейма данных Arules в R

Привет. Я преобразовал свои правила в фрейм данных для дальнейшего анализа, но проблема в том, что мой фрейм данных выглядит так:

df <- data.frame(rules=c("{45107} => {62557}","{17759} => {60521 }",
"{53721} => {53720}","{63830} => {17753}","{45413} => {45412}",
"{3885,59800,17759} => {4749}","{17721,55906} => {9314}"))

    rules
{45107} => {62557}
{17759} => {60521 }
{53721} => {53720}
{63830} => {17753}
{45413} => {45412}
{3885,59800,17759} => {4749}
{17721,55906} => {9314}

Можете ли вы помочь мне преобразовать мой фрейм данных в этот формат?

lhs1    lhs2    lhs3    rhs
45107           62557
17759           60521
53721           53720
63830           17753
45413           45412
3885    59800   17759   4749
17721   55906   9314

person jbest    schedule 26.11.2014    source источник
comment
@sayan dasgupta, я уже преобразовал свои правила во фрейм данных, поэтому теперь моя проблема заключается в том, как разделить мой столбец на несколько столбцов во фрейме данных. Проблема на самом деле не имеет ничего общего с правилами.   -  person jbest    schedule 26.11.2014
comment
ой извините да; понятно   -  person sayan dasgupta    schedule 26.11.2014
comment
Извините за вопрос, но я думаю, что все числа после => будут отправлены в столбец rhs, а все числа до этого будут отправлены в столбцы lhs.?   -  person Cath    schedule 26.11.2014
comment
@ CathG Я тоже так подумал, когда изменил свои правила во фрейм данных, но, к сожалению, они сливаются в 1 столбец, называемый правилами.   -  person jbest    schedule 26.11.2014


Ответы (2)


С вашим data.frame df и размещением всех чисел после => в rhs :

# define the number of maximum "lhs", there is 2 options :
   # option 1, if there are few rules and number of maximum "lhs" is obvious :
maxlhs<-3
   # option 2, if there are many many rules and you don't want to count all "lhs" :
maxlhs<-max(sapply(df$rules,FUN=function(x)length(gregexpr(',',x)[[1]]))) + 1 

# create your new data.frame by "reformatting" the rules
newdf<-t(apply(df,1,function(rule,maxlhs){
                split1<-strsplit(gsub("[ }{]","",rule),"=>")[[1]]
                split2<-strsplit(split1[1],",")[[1]]
                split2<-c(split2,rep(NA,maxlhs-length(split2)))
                return(as.numeric(c(split2,split1[2])))
                    },maxlhs=maxlhs))
# name the new data.frame's columns
colnames(newdf)<-c(paste0("lhs",1:maxlhs),"rhs")

> newdf
      lhs1  lhs2  lhs3   rhs
[1,] 45107    NA    NA 62557
[2,] 17759    NA    NA 60521
[3,] 53721    NA    NA 53720
[4,] 63830    NA    NA 17753
[5,] 45413    NA    NA 45412
[6,]  3885 59800 17759  4749
[7,] 17721 55906    NA  9314

Это нормально или вы хотите, чтобы новый data.frame был точно таким же, как тот, который отображается в вашем вопросе?

person Cath    schedule 26.11.2014
comment
Вам нужно определить, что максимальное количество возможных переменных lhs равно 3. здесь жестко запрограммировано - person sayan dasgupta; 26.11.2014
comment
@sayandasgupta, да, вы правы, я укажу это как параметр, спасибо! - person Cath; 26.11.2014
comment
используйте это maxlhs <- max(sapply(df$rules,FUN=function(x)length(gregexpr(',',x)[[1]]))) + 1 - person sayan dasgupta; 26.11.2014
comment
@sayandasgupta, хотя это может быть и не нужно, если правил всего несколько, это действительно может быть очень полезно в случае их множества, так что, опять же, вы правы, я добавлю строку и еще раз спасибо . - person Cath; 26.11.2014

Вы также можете сделать что-то подобное, что должно быть довольно эффективно.

library(splitstackshape)  ## for cSplit() and loads data.table package

dt <- data.table(
    do.call(rbind, strsplit(gsub("[{} ]", "", df$rules), "=>"))
)
cbind(cSplit(dt[, .(V1)], "V1", ","), dt[, .(V2)])

#     V1_1  V1_2  V1_3    V2
# 1: 45107    NA    NA 62557
# 2: 17759    NA    NA 60521
# 3: 53721    NA    NA 53720
# 4: 63830    NA    NA 17753
# 5: 45413    NA    NA 45412
# 6:  3885 59800 17759  4749
# 7: 17721 55906    NA  9314
person Rich Scriven    schedule 27.11.2014