比较 R 中的列表元素



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

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)
  }
}

请帮忙。

问题是你没有在你的例子中定义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

相关内容

  • 没有找到相关文章

最新更新