рассмотрим два вектора 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
}
, что не помогает.Я действительно не знаю, что я здесь не так сделал.Я искал в Интернете и переполнении стека, но я не мог найти решение.Я надеюсь, что вы можете!