Функция MATCH в r
имеют списки, первый (list1) имеет id, имя, возраст и другие (list2, list3, ..) имеет идентификаторы и тестовое значение (уникальное).
список 1:
id age name bio-test 1 40 danny 2 16 nora 3 35 james 4 21 ben
список 2 (биотест):
- VLOOKUP с несколькими критериями
- Как заставить VLOOKUP вернуть совпадение * last *?
- Как оптимизировать vlookup для высокого количества поиска? (альтернативы VLOOKUP)
- Быстрая замена # N / A на 0, когда vlookup
- «Не удалось получить свойство VLookup classа WorksheetFunction»
id test passed year 1 100 yes 1 5 80 yes n/a 4 55 no 2
Я пытаюсь добавить к списку1 значение теста для каждого идентификатора (не каждый идентификатор имеет тестовое значение).
это часть кода:
for (i in 1:length(list1)) { list1$test1value <- list2$test[match(list1$id[i], list2$id[i]), nomatch = NA_integer_, incomparables = NULL)] }
но вместо этого, проверяя значение теста по id, он скопировал только первое тестовое значение из списка2 и скопировал его на 200 ячеек, а остальные 3000 были N / A.
что не так?
- Как я могу VLOOKUP в нескольких документах Excel?
- Применить формулу VLOOKUP к нескольким листам
- Список поиска зависит от содержимого другой ячейки
- Vlookup с использованием 2 столбцов для ссылки на другой
- Excel - сопоставление значений в столбцах на разных вкладках, а затем вставка в другой столбец, если есть совпадение
- Расширенная формула Vlookup Excel
- Мне нужна ячейка для автоматического заполнения, когда данные вводятся в соседнюю ячейку
- Как сделать vlookup и заполнить (например, в Excel) в R?
Сначала у вас есть опечатки в вашем примере. Во-вторых, для назначения «list1 $ test1value» должно быть добавлено «[i]», чтобы не сохранять за каждый раунд. Также не должно быть ‘[i]’ добавлено в list2$id
так как вы хотите искать весь вектор для поиска.
for (i in 1:length(list1)) { list1$test1value[i] <- list2$test[match(list1$id[i], list2$id, nomatch = NA_integer_, incomparables = NULL)] }
Код работает, но здесь нет никаких оснований для каких-либо петель. Вы показываете отсутствие понимания того, как работает R. Следующий код делает то же самое гораздо быстрее.
list1$test1value <- list2$test[match(list1$id, list2$id)]
R построен таким образом, что вам не нужно держать руку и наставлять ее, как пройти через каждый элемент вектора. match
будет автоматически проходить через каждого члена по одному и искать его в другом векторе для вас. Он также будет упорядочивать результат в наборе данных.
Я закрою это как дубликат, потому что, как предложили другие, merge
идеально подходит для этого.
merge(list1, list2[c("id", "test")], all.x=TRUE) # id age name test #1 1 40 danny 100 #2 2 16 nora NA #3 3 35 james NA #4 4 21 ben 55