2016-06-08 148 views
0

我创建了两个列表,名为list1的拳头有4个包含4位的元素,第二个list2包含1个包含4位的元素。我想比较列表,如果list1中的任何元素与list2中的唯一元素相同,那么我想从list1中删除该元素。我已经实现了下面的代码,但没有得到正确的结果。比较R中的列表元素

list1<-c() 
n<-4 
#Creating list1 with 4 vectors having 4 bits each 
for(i in 1:5) 
{ 
    rndno<-round(runif(1, 1, 2^n -1),0) 
    bn<-bin(rndno) 
    pad<-rep.int(0,n-length(bn)) 
    bn<-c(pad,bn) 
    list1<-rbind(list1,bn) 
} 
list2<-c() 
rndno<-round(runif(1, 1, 2^n -1),0) 
bn<-bin(rndno) 
pad<-rep.int(0,n-length(bn)) 
bn<-c(pad,bn) 
list2<-rbind(list2,bn) 
for(i in 1:nrow(k)) 
{ 
    if(list2[1,] == list2[i,]) 
    { 
    print(i) 
    } 
} 

请帮忙。

回答

0

问题是你没有在你的例子中定义bin函数,所以我们只能猜测你想实现什么。但我认为你想这样做:

bin <- function(x) { 
    i <- 0 
    string <- numeric(32) 
    while(x > 0) { 
    string[32 - i] <- x %% 2 
    x <- x %/% 2 
    i <- i + 1 
    } 
    first <- match(1, string) 
    string[first:32] 
} 

此功能将您的十进制数转换为二进制。

它也是有用的随机数生成器设置成给定值 为了使你的脚本重复性:

set.seed(1) 

现在,这是下面的代码,虽然它可能不是最有效方式来创建您的数据。还要注意你命名了你的对象列表,但实际上,你在这里处理矩阵。现在

list1<-c() 
n<-4 
#Creating list1 with 4 vectors having 4 bits each 
for(i in 1:5) 
{ 
    rndno<-round(runif(1, 1, 2^n -1),0) 
    bn<- bin(rndno) 
    pad<-rep.int(0,n-length(bn)) 
    bn<-c(pad,bn) 
    list1<-rbind(list1,bn) 
} 

# [,1] [,2] [,3] [,4] 
# bn 0 1 0 1 
# bn 0 1 1 0 
# bn 1 0 0 1 
# bn 1 1 1 0 
# bn 0 1 0 0 

list2<-c() 

rndno<-round(runif(1, 1, 2^n -1),0) 
bn<-bin(rndno) 
pad<-rep.int(0,n-length(bn)) 
bn<-c(pad,bn) 
list2<-rbind(list2,bn) 

# [,1] [,2] [,3] [,4] 
# bn 1 1 1 0 

,为了从list1删除list2指定的值,你的矩阵的行比较,以你的目标向量和您只选择了行不存在完全匹配:

list1[apply(apply(list1, 1, function(x) x == list2), 2, function(x) any(x == FALSE)),] 

# [,1] [,2] [,3] [,4] 
# bn 0 1 0 1 
# bn 0 1 1 0 
# bn 1 0 0 1 
# bn 0 1 0 0 
+0

这个解决方案是否适合你?我是否正确地理解了'bin'函数应该做什么?如果没有,请通过编辑您的问题来给函数定义,我们可以再看一下。 – sparrow