在R中比较数据集

4

我已经将一组格式为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} 的商品。

因此,在我的示例中,我的结果数据集将是:

<code>{Pierre, lait, oeuf, beurre, pain}
{Paul,lait}
{Jacques, oeuf, pain,}
</code>

我相信这很简单,但是我希望能够阅读建议/答案来帮助我一点。
3个回答

5

另一个答案引用了%in%,但在这种情况下intersect更方便(您可能还想看一下match,但我认为它与%in%文档记录在同一个地方)- 使用lapplyintersect我们可以将答案变成单行:

数据:

> 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"

非常感谢Ben,这个方法听起来不错且简单明了。现在我会尝试理解如何实现它,以便从CSV文件构建输入列表,并将lapply方法的输出写入一个带有列表的文件中。再次感谢。 - EvidenceMe So

4

一种方法是如下所示(但是,由于我将结构保留为矩阵,因此在数据已被删除时我留下了NAs(如果将其导出到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    

在周日深夜疲惫的状态下,我忘记了*apply函数 - 这些函数相当简单,可以减少代码量。 - ChrisW

1

%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

1
非常感谢你们,听起来是个有趣的方法,我会尝试一下。 - EvidenceMe So

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接