总结循环的逻辑结果

时间:2019-02-21 10:54:31

标签: r loops

考虑两个向量test1 <- c(1,2,3,4,5,3) test2 <- c(2,3,4,5,6,7,2)我的目标是创建一个向量,该向量仅包含可以在两个向量中找到的值。结果应为2 3 4 5

之类的向量

对此,我有两个问题。

1)如何在R中得到想要的结果? (即使使用3个向量,例如test3 <- c(1,3,5,6,7),我也希望获得可以在所有三个向量3 5中找到的所有值

2)我试图为此编写一个循环,但是它无法按预期完成工作。奇怪的是,如果我手动运行代码的每一步,一切都会按预期进行。我想念什么?为什么我的代码不起作用?

这个想法是创建一个向量test4 <- c(test1, test2)并迭代检查是否可以在test1和test2中找到该值。

for(i in levels(as.factor(test4))){        #loop for all occuring levels
  log1 <- rep(0,nlevels(as.factor(test4))) #create logical vector
  log1 <- as.logical(log1)                 #to store results
  if(is.element(i,test1) == TRUE & is.element(i,test2) == TRUE){
    log1[which(levels(as.factor(test4)) == i)] <- TRUE
  } else{
    log1[which(levels(as.factor(test4)) == i)] <- FALSE
}
#if i is element of test1 and test2 the the corresponding entry
#in log1 becomes TRUE, otherwise FALSE

这导致结果

log1
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE

现在,人们可以想到循环中的错误。为了进行检查,我打印了所有值,它们都是正确的:

for(i in levels(as.factor(test4))){
  if(is.element(i,test1) == TRUE & is.element(i,test2) == TRUE){
    print(TRUE)
  } else{
    print(FALSE)
  }
}
[1] FALSE
[1] TRUE
[1] TRUE
[1] TRUE
[1] TRUE
[1] FALSE
[1] FALSE

要检查索引,我运行此代码

for(i in levels(as.factor(test3))){
  j <- which(levels(as.factor(test3)) == i)
  print(j)      
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7

到目前为止,一切似乎都是正确的。现在,我手动运行代码并获得所需的结果:

test1 <- c(1,2,3,4,5)
test2 <- c(2,3,4,5,6,7)

test4 <- c(test1, test2)         

log1 <- rep(0,nlevels(as.factor(test4)))
log1 <- as.logical(log1)

log1[1] <- is.element(1,test1) == TRUE & is.element(1,test2) == TRUE
log1[2] <- is.element(2,test1) == TRUE & is.element(2,test2) == TRUE
log1[3] <- is.element(3,test1) == TRUE & is.element(3,test2) == TRUE
log1[4] <- is.element(4,test1) == TRUE & is.element(4,test2) == TRUE
log1[5] <- is.element(5,test1) == TRUE & is.element(5,test2) == TRUE
log1[6] <- is.element(6,test1) == TRUE & is.element(6,test2) == TRUE
log1[7] <- is.element(7,test1) == TRUE & is.element(7,test2) == TRUE
log1
[1] FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE

我试图设置索引j <- which(levels(as.factor(test4)) == i)并替换条目log[j]

if循环不是必需的,但是它有助于定位问题。 for循环可以写为

for(i in levels(as.factor(test4))){
  log1 <- rep(0,nlevels(as.factor(test4)))
  log1 <- as.logical(log1)
  log1[which(levels(as.factor(test4)) == i)] <- is.element(i,test1) == TRUE & is.element(i,test2) == TRUE
}

这没有帮助。我真的不知道,我在这里做错了什么。我在网上和堆栈溢出时进行搜索,但是找不到解决方案。我希望你能做到!

1 个答案:

答案 0 :(得分:0)

收集唯一值,然后重复:

all <- c(unique(test1), unique(test2))
all[duplicated(all)]