Сравнить наборы данных в R - PullRequest
4 голосов
/ 15 января 2012

Я собрал набор транзакций в файл CSV в формате:

{Pierre, lait, oeuf, beurre, pain}
{Paul, mange du pain,jambon, lait}
{Jacques, oeuf, va chez la crémière, pain, voiture}

Я планирую провести простой анализ правил ассоциации, но сначала я хочу исключить элементы из каждой транзакции, которые непринадлежат ReferenceSet = {lait, oeuf, beurre, pain}.

Таким образом, мой результирующий набор данных будет, в моем примере:

{Pierre, lait, oeuf, beurre, pain}
{Paul,lait}
{Jacques, oeuf, pain,}

Я уверен, что это довольно просто, но я хотел бы прочитать предложения / ответы напомогите мне немного.

Ответы [ 3 ]

5 голосов
/ 16 января 2012

Другой ответ ссылается на %in%, но в этом случае intersect еще удобнее (вы также можете посмотреть на match - но я думаю, что это задокументировано в том же месте, что и %in%) -с lapply и intersect мы можем сделать ответ в одну строку:

Данные:

> L <- list(pierre=c("lait","oeuf","beurre","pain") ,
+           paul=c("mange du pain", "jambon", "lait"),
+           jacques=c("oeuf","va chez la crémière", "pain", "voiture"))
> reference <- c("lait", "oeuf", "beurre", "pain")

Ответ:

> lapply(L,intersect,reference)
$pierre
[1] "lait"   "oeuf"   "beurre" "pain"  

$paul
[1] "lait"

$jacques
[1] "oeuf" "pain"
4 голосов
/ 16 января 2012

Один из способов заключается в следующем (но, поскольку я оставляю структуру в виде матрицы, я оставляю NA, где были удалены данные (они могут быть удалены при экспорте обратно в CSV); я также уверен, что возможно делать это без циклов - это сделает его быстрее (но, ИМХО, менее читабельным), и я уверен, что есть более эффективный способ сделать логику тоже - мне также было бы интересно увидеть чье-то еще мнение об этом)

ref <- c("lait","oeuf","beurre","pain")
input <- read.csv("info.csv",sep=",",header=FALSE,strip.white=TRUE)

> input
   V1            V2                  V3     V4      V5
1  Pierre          lait                oeuf beurre    pain
2    Paul mange du pain              jambon   lait        
3 Jacques          oeuf va chez la crémière   pain voiture

input <- as.matrix(input)
output <- matrix(nrow=nrow(input),ncol=ncol(input))
currentRow <- c()

for(i in 1:nrow(input)) {
  j <- 2
  output[i,1]<-input[i,1]
  for(k in 2:length(input[i,])) {
    if(toString(input[i,k]) %in% ref){
      output[i,j] <- toString(input[i,k])
      j<-j+1
    }
  }
}

> output
     [,1]      [,2]   [,3]   [,4]     [,5]  
[1,] "Pierre"  "lait" "oeuf" "beurre" "pain"
[2,] "Paul"    "lait" NA     NA       NA    
[3,] "Jacques" "oeuf" "pain" NA       NA    
1 голос
/ 15 января 2012

Оператор %in% пригодится.

pierre <- c("lait","oeuf","beurre","pain")  
paul <- c("mange du pain", "jambon", "lait")  
jacques <- c("oeuf","va chez la crémière", "pain", "voiture")

reference <- c("lait", "oeuf", "beurre", "pain")

pierre_fixed <- pierre[pierre %in% reference]
paul_fixed <- paul[paul %in% reference]
jacques_fixed <- jacques[jacques %in% reference]  

pierre_fixed 
paul_fixed
jacques_fixed
...