Возьмите этот воспроизводимый пример:
set.seed(1)
list1 <- letters[1:10]
list1names
list2 <- letters[sample(1:10, 10)]
Вы можете избежать цикла, используя ifelse
:
newlist <- ifelse(list1==list2, list2, 0)
Проблема в том, что вы не объявили newname
, вы имели в виду newlist
?
Если вы хотите использовать цикл, вы можете использовать только один цикл, а не 2, потому что length(list1)
= length(list2)
:
for (i in 1:length(list1)){
if(list1[i] == list2[i]){newlist[i]<- list2[i]}else {newlist[i]= 0}
}
В общем, если вы хотите сопоставить элементы в векторах, вы можете использовать match
, например:
> list1
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
> list2
[1] "c" "d" "e" "g" "b" "h" "i" "f" "j" "a"
> match(list1, list2)
[1] 10 5 1 2 3 8 4 6 7 9
Как видите, match
получает индексы элементов в list2
, которые равны элементам в list1
. Это полезно, если у вас есть другая таблица data2
, и вы хотите извлечь столбец в data2 для соответствующих элементов из данных $ list1 в data2$list3
, вы должны использовать:
data <- data.frame(list1, list2)
list3 <- list2
columntoget <- 1:length(list2)
data2 <- data.frame(list3, columntoget)
data$mynewcolumn <- data2$columntoget[match(data$list1, data2$list3)]
> data$mynewcolumn
[1] 10 5 1 2 3 8 4 6 7 9