2016-12-15 56 views
1

有列表,第一个(list1)有id,name,age和其他的(list2,list3,..)有ids和测试值(唯一的)。MATCH函数r

列表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 

我试图添加到测试值的每个ID LIST1每个ID(没有测试值)。

这是代码的一部分:

for (i in 1:length(list1)) { 
list1$test1value <- list2$test[match(list1$id[i], list2$id[i]), 
nomatch = NA_integer_, incomparables = NULL)] } 

而是查找由ID的测试值,它从list2中复制只是第一测试值,并将其复制到200个细胞和其他3000是N /一个。

有什么不对?

+0

改变了它。谢谢。 – anat

+0

这里是[相关的问题](http://stackoverflow.com/questions/41149718/overwriting-a-row-with-a-matched-id-value-in-the-same-dataframe/41150472#41150472)from昨天。我的答案使用'match'来填充缺失值的行。 'merge'可以让你的问题更容易解决。像'merge(df1,df2,by =“id”,all = TRUE)''。 – lmo

+0

合并对我的目的不好,我不想创建一个不同的文件并合并两个..我只是想从每个list2,list3到list1具有相同的ID复制一个值。无论如何, – anat

回答

2

首先你在你的例子中有错别字。其次,'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 
+0

非常感谢。 – anat