Подмножество R в правилах ассоциации из spmf

код:

data=read.csv("./spmf1234.csv",header=F);

df<- data.frame(do.call('rbind', strsplit(as.character(data$V1),'#',fixed=F)));

df2<- data.frame(do.call('rbind', strsplit(as.character(df$X1),'==>',fixed=F)));

df3=cbind(df2,df);

colnames(df3)=c("lhs","rhs","rule","support","confidence","lift");

df4 <- subset(df3, select = c(lhs,rhs,support,confidence,lift));

final=subset(df4,lhs!=1);

Я пытаюсь использовать приведенный выше код в файле csv, который я получил от spmf, используя fp-growth, чтобы получить правила ассоциации. Я хочу, чтобы все правила, имеющие «1» в левой части, были удалены, однако это не работает.

CSV-файл:

2 ==> 1 #SUP: 1 #CONF: 0,33333 #LIFT: 0,66667

1 ==> 2 #SUP: 1 #CONF: 0,33333 #LIFT: 0,66667

3 ==> 1 #SUP: 2 #CONF: 0.5 #LIFT: 1

1 ==> 3 #SUP: 2 #CONF: 0.66667 #LIFT: 1

3 ==> 2 #SUP: 2 #CONF: 0.5 #LIFT: 1

2 ==> 3 #SUP: 2 #CONF: 0,66667 #LIFT: 1

2 3 ==> 1 #SUP: 1 #CONF: 0.5 #LIFT: 1

1 3 ==> 2 #SUP: 1 #CONF: 0.5 #LIFT: 1

1 2 ==> 3 #SUP: 1 #CONF: 1 #LIFT: 1.5

3 ==> 1 2 #SUP: 1 #CONF: 0,25 #LIFT: 1,5

2 ==> 1 3 #SUP: 1 #CONF: 0.33333 #LIFT: 1

1 ==> 2 3 #SUP: 1 #CONF: 0.33333 #LIFT: 1


person user2778822    schedule 01.08.2014    source источник


Ответы (1)


final=subset(df4,lhs!=1) 

сравнивает символ с числовым, что не работает:

# > as.character(df4$lhs)
# [1] "2 "   "1 "   "3 "   "1 "   "3 "   "2 "   "2 3 " "1 3 " "1 2 " "3 "   "2 "   "1 "  

вы можете использовать регулярное выражение, подобное этому:

final = subset(df4, !grepl("1\\b", lhs))
# > final
#    lhs   rhs support     confidence          lift
# 1    2     1  SUP: 1  CONF: 0.33333  LIFT: 0.66667
# 3    3     1  SUP: 2      CONF: 0.5        LIFT: 1
# 5    3     2  SUP: 2      CONF: 0.5        LIFT: 1
# 6    2     3  SUP: 2  CONF: 0.66667        LIFT: 1
# 7  2 3     1  SUP: 1      CONF: 0.5        LIFT: 1
# 10   3   1 2  SUP: 1     CONF: 0.25      LIFT: 1.5
# 11   2   1 3  SUP: 1  CONF: 0.33333        LIFT: 1

Добавить:

## data preperation
data <- readLines(con = textConnection("  
2 ==> 1 #SUP: 1 #CONF: 0.33333 #LIFT: 0.66667
1 ==> 2 #SUP: 1 #CONF: 0.33333 #LIFT: 0.66667
3 ==> 1 #SUP: 2 #CONF: 0.5 #LIFT: 1
1 ==> 3 #SUP: 2 #CONF: 0.66667 #LIFT: 1
3 ==> 2 #SUP: 2 #CONF: 0.5 #LIFT: 1
2 ==> 3 #SUP: 2 #CONF: 0.66667 #LIFT: 1
2 3 ==> 1 #SUP: 1 #CONF: 0.5 #LIFT: 1
1 3 ==> 2 #SUP: 1 #CONF: 0.5 #LIFT: 1
1 2 ==> 3 #SUP: 1 #CONF: 1 #LIFT: 1.5
3 ==> 1 2 #SUP: 1 #CONF: 0.25 #LIFT: 1.5
2 ==> 1 3 #SUP: 1 #CONF: 0.33333 #LIFT: 1
1 ==> 2 3 #SUP: 1 #CONF: 0.33333 #LIFT: 1"))
r <- regexec(pattern = "([0-9 ]+)\\s==>\\s([0-9 ]+)\\s\\#SUP:\\s([0-9.]+)\\s\\#CONF:\\s([0-9.]+)\\s\\#LIFT:\\s([0-9.]+)", 
             text = data)
m <- regmatches(data, r)
df <- setNames(as.data.frame(do.call(rbind, lapply(m, "[", -1)), stringsAsFactors = FALSE), 
               c("lhs", "rhs", "support", "confidence", "lift"))

## rows to include/exclude
include <- sapply(strsplit(df$lhs, " "), function(x) !any(as.integer(x) %in% 1:1000))
df[include, ]
person lukeA    schedule 01.08.2014
comment
спасибо, это действительно помогает. только один вопрос, если я использую этот метод и не хочу включать список чисел в левой (или правой) части, тогда я должен использовать это в цикле, передавая одно число за раз. есть ли другой способ более эффективно передать полный список чисел, которые я не хочу включать в левый (или правый) - person user2778822; 01.08.2014
comment
Вы можете разделить список номеров с помощью вертикальной черты (или оператора). Например. !grepl("\\b1\\b|\\b2\\b", lhs) исключит 1 и 2. \\b — маркер границы слова: regular-expressions.info/wordboundaries.html. - person lukeA; 01.08.2014
comment
я пытаюсь использовать следующее в цикле. помогите: for(i in 0:1000) {df2 = subset(df1, !grepl(\\bi\\b, lhs)) df1=df2} - person user2778822; 01.08.2014
comment
Чего вы хотите добиться в итоге? Цикл for во многом не имеет для меня смысла, начиная с paste0("\\b", i, "\\b") вместо "\\b1\\b|\\b2\\b". - person lukeA; 01.08.2014
comment
я хочу удалить все те строки из набора данных, в которых есть 1,2,3... до 1000. - person user2778822; 01.08.2014
comment
Смотрите мое добавление - это удаляет все строки, которые получили от 1 до 1000 на lhs - person lukeA; 01.08.2014