【问题标题】:R programming. Dataframe and subsetsR编程。数据框和子集
【发布时间】:2018-03-25 07:27:28
【问题描述】:

仅从数据框中选择唯一集 这里一组 = 一行数据框。 r 中的语法? 我想要设定概念 看这个例子

1 1 2

1 2 1

1 2 3

o/p:

1 1 2

1 2 3

这里的 row1 和 row2 组成了sets ={1,2},所以我只需要这些行的一个副本。

这是我的先验算法代码。函数 trim(data,r) 是我一直在尝试的解决方案,但没有成功。


uniqueItemSets<-function(data){

    #unique items in basket
    items <- c()

        for(j in c(1:ncol(data))){
            items <- c(items,unique(data[,j]))      
        }

        items <- unique(items)
    #return(as.list(items))
    return(items)
}
F_itemset<-function(data,candidate,sup){

    count <- rep(0,nrow(candidate))

    for(i in c(1:nrow(data))){          #every transaction
        for(j in c(1:nrow(candidate))){ #every dataset
            x <- candidate[j,]
            #x <- uniqueItemSets(x)

            y <- data[i,]
            #y <- uniqueItemSets(y)     
            if(all(x %in% y)){
                count[j] <- count[j] + 1
            }
        }       
    }
    #pruning
    pp<-cbind(candidate,count)
    pp<-as.data.frame(pp)
      pp<-subset(pp,pp$count>=sup)

    return(pp)
}
#k-itemset :k-value
makeItemSet<- function(candidate,k){

    l<-combn(candidate,k,simplify=FALSE)
    return(l)
} 

aprio<-function(data,sup,conf,kmax){

    C <- uniqueItemSets(data)
    C <- as.data.frame(C)
    for(k in c(2:kmax))
    {
        F <- F_itemset(data,C,sup)
        F$count <- NULL
        if(nrow(F)<k){
            break;
        }
        F<-t(F)
        C <- combn(F,k,simplify=FALSE)
        C <- as.data.frame(C)
        C <- t(C)   #transpose
        C<-unique(C)
        trim(C,1)
    }
    return(F)
}

**

new <- data.frame()
trim<-function(data,r)
{
    x<-as.data.frame(data[r,])
    c<-c()
    for(j in c(1:ncol(x))){
        c<-c(c,x[,j])
    }
    c<-unique(c)
    if(r+1<=nrow(data)){
    for(i in c((r+1):nrow(data))){
        t<-c()
        for(j in c(1:ncol(data))){
            t<-c(t,data[i,j])
        }
        t<-unique(t)
        if(all(t %in% c) && all(c %in% t))
        {
            data[-i,]
        }
    }
    new <- as.data.frame(data)
    if(r+1 < nrow(data)){
        trim(data[r+1:nrow(data),],r+1)
    }
    }

}

**

【问题讨论】:

  • 如果你想知道为什么所有的反对票: 1. SO 不是来做你的功课的。 2. 你没有表现出任何代码努力。阅读this post 将有助于解决未来的问题

标签: r dataframe unique subset


【解决方案1】:

您可以使用apply 和margin = 1 来执行逐行函数。唯一需要注意的是,您需要转置结果以获得所需的顺序

d <- data.frame(number1 = c(1,1,1),
                number2 = c(1,2,2),
                number3 = c(2,1,3))

# next two statements can be run in one line of code if you want
d_sort <- t(apply(d, 1, sort))

# get rid of duplicate rows
unique(d_sort)

     [,1] [,2] [,3]
[1,]    1    1    2
[2,]    1    2    3

【讨论】:

  • 它有助于减少我的数据框。但是,考虑一下,row1 : 1 1 2 row2 : 1 2 2 应用您的代码后,这两行仍然存在。冗余仍然存在。我需要类似 if all(x %in% y) && (y%in%x) 然后在所有这些行中只取一行。您可以在我的代码的修剪功能中看到这种方法。 @phiver
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多