r中的MATCH函数

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]',以避免在每一轮中保存。也不应该在list2$id中添加'[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的建立是为了不必握着它的手指导它如何遍历向量的每个元素。match将自动逐个迭代每个成员,并在另一个向量中为您查找它。它还将在数据集中有序地分配结果。

我会把这个作为一个副本关闭,因为正如其他人所建议的,merge是完美的。

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