R语言中使用match函数匹配多重复记录时返回全NA问题求助
解决df1添加sessions列的问题
首先,我猜你大概率是用match()时搞反了参数顺序,或者遇到了隐形的字符不一致问题。先结合你的数据来一步步解决:
先把你的数据框构造出来方便测试:
df1 <- data.frame( query = c("apple", "apple", "banana", "bad apples"), page = c("site.com", "site.com/apples", "site.com/bananas", "site.com/apples"), stringsAsFactors = FALSE ) df2 <- data.frame( page = c("site.com", "site.com/apples", "site.com/bananas"), sessions = c(20, 30, 50), stringsAsFactors = FALSE )
正确的match()用法
match()的逻辑是用第一个参数的每个元素,去第二个参数里找匹配的位置,所以正确的写法应该是:
df1$sessions <- df2$sessions[match(df1$page, df2$page)]
运行后df1会得到正确的结果:
query page sessions 1 apple site.com 20 2 apple site.com/apples 30 3 banana site.com/bananas 50 4 bad apples site.com/apples 30
为什么你的原代码返回NA?
最常见的坑是参数顺序搞反:如果写成match(df2$page, df1$page),相当于用df2的page去匹配df1的page,得到的索引完全不对,自然返回NA。
另外还要排查隐形问题:比如两个数据框的page列有没有末尾空格、大小写差异(比如"site.com/apples "和"site.com/apples"),这种肉眼看不到的差异会导致匹配失败。可以先清理一下:
df1$page <- trimws(df1$page) df2$page <- trimws(df2$page)
更直观的替代方案
如果觉得match()容易搞混,用专门的连接函数更省心:
1. 基础R的merge()
df1_merged <- merge(df1, df2, by = "page", all.x = TRUE)
all.x = TRUE会保留df1的所有行,只匹配df2里对应的sessions。
2. tidyverse的left_join()
用dplyr的写法更清晰:
library(dplyr) df1_merged <- df1 %>% left_join(df2, by = "page")
内容的提问来源于stack exchange,提问作者Jeff Swanson
相关产品推荐
相关产品推荐

