比较R中

问题描述:

数据集,我已经收集了一组交易的格式的CSV文件:比较R中

{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,} 

我敢肯定,这是很简单,但很愿意阅读的建议/答案,帮助我一下。

%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

非常感谢你们所有人,听起来有趣的方法,去尝试它们。 – 2012-01-15 22:08:25

一种方法是如下(但是,因为我离开了结构作为基质我已经离开那里的数据已被删除(如果出口回CSV这些可以被删除NAS);我也是肯定可以做到没有循环 - 这会让它更快(但是,恕我直言,不太可读),我相信还有一种更有效的方式来执行逻辑 - 我也有兴趣看到别人的观点这一点)

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  
+0

在我傍晚的星期天疲惫中,我忘记了'* apply'函数 - 这些都相当直接,并且会将代码截断 – ChrisW 2012-01-16 11:47:06

另一个答案引用%in%,但在这种情况下intersect甚至更​​加得心应手(你可能想看看match,太 - b UT我认为这是在同一个地方记录为%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" 
+0

非常感谢Ben,这种方法听起来很好直接。现在我会尝试了解如何实现它以便从csv文件构建输入列表,并将lapply方法的输出写入带有列表的文件中。再次感谢 – 2012-01-16 11:09:34