Функция 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 (биотест):

 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.

что не так?

Сначала у вас есть опечатки в вашем примере. Во-вторых, для назначения «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 
  • VLOOKUP с несколькими критериями, возвращающими значения в одной ячейке
  • Vba Excel делает vlookup из закрытого файла
  • Excel беспорядок с моей формулой при копировании, как я могу остановить, я перестаю менять одну часть, но не другую?
  • Excel. Как vlookup вернуть несколько значений?
  • Давайте будем гением компьютера.