MATCH function in r
本问题已经有最佳答案,请猛点这里访问。
有列表,第一个(列表1)有ID、名称、年龄,另一个(列表2、列表3等)有ID和测试值(唯一)。
列表1:
1 2 3 4 5 | id age name bio-test 1 40 danny 2 16 nora 3 35 james 4 21 ben |
清单2(生物试验):
1 2 3 4 | id test passed year 1 100 yes 1 5 80 yes n/a 4 55 no 2 |
号
我正在尝试向列表1中添加每个ID的测试值(并非每个ID都有一个测试值)。
这是代码的一部分:
1 2 3 | 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个是不适用的。
怎么了?
首先,您的示例中有拼写错误。其次,"list1$test1value"的赋值应该添加一个'[i]',以避免在每一轮中保存。也不应该在
1 2 3 | for (i in 1:length(list1)) { list1$test1value[i] <- list2$test[match(list1$id[i], list2$id, nomatch = NA_integer_, incomparables = NULL)] } |
代码可以工作,但这里没有任何循环的理由。你对R的运作方式缺乏了解。下面的代码做同样的事情要快得多。
1 | list1$test1value <- list2$test[match(list1$id, list2$id)] |
号
r的建立是为了不必握着它的手指导它如何遍历向量的每个元素。
我会把这个作为一个副本关闭,因为正如其他人所建议的,
1 2 3 4 5 6 | 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 |