考虑两个向量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
}
这没有帮助。我真的不知道,我在这里做错了什么。我在网上和堆栈溢出时进行搜索,但是找不到解决方案。我希望你能做到!
答案 0 :(得分:0)
收集唯一值,然后重复:
all <- c(unique(test1), unique(test2))
all[duplicated(all)]