r中的匹配函数

r中的匹配函数,r,match,vlookup,R,Match,Vlookup,有列表,第一个(列表1)有id、名称、年龄,其他(列表2、列表3,…)有id和测试值(唯一) 清单1: id age name bio-test 1 40 danny 2 16 nora 3 35 james 4 21 ben 清单2(生物测试): 我试图将测试值添加到列表1中的每个id(不是每个id都有测试值) 这是代码的一部分: for (i in 1:length(list1)) { list1$test1value &l

有列表,第一个(列表1)有id、名称、年龄,其他(列表2、列表3,…)有id和测试值(唯一)

清单1:

id  age name    bio-test    
1   40  danny
2   16  nora            
3   35  james
4   21  ben
清单2(生物测试):

我试图将测试值添加到列表1中的每个id(不是每个id都有测试值)

这是代码的一部分:

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

list1$test1value首先,您的示例中有输入错误。其次,“list1$test1value”的赋值应该添加一个“[i]”以避免在每一轮中保存。也不应该在
list2$id
中添加“[i]”,因为您希望搜索整个向量以进行查找

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

更改了它。谢谢。这是昨天的一个示例。我的答案使用
match
来填充缺少的值行。使用
merge
可以更轻松地解决您的问题。类似于
merge(df1,df2,by=“id”,all=TRUE)
.merge不适合我的目的,我不想创建不同的文件并合并这两个文件..我只想将每个列表2、列表3..中的一个值复制到具有相同id的列表1。复制将不受影响,
merge
方法很容易应用。您可以重新分配到原始数据。frame:
df1如果列表2有4000个id,列表1有5000个id,它将删除剩下的1000个。如果列表1存在,我需要向列表1添加一个测试值,如果不存在。据我所知,匹配与excel中的vlookup最为相似。你知道我的匹配代码有什么问题吗?
for (i in 1:length(list1)) { 
  list1$test1value[i] <- list2$test[match(list1$id[i], list2$id,
                             nomatch = NA_integer_, incomparables = NULL)] }
list1$test1value <- list2$test[match(list1$id, list2$id)]
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