R语言合并不同长度数据框:匹配指定列并保留首个URL
嘿,刚学R就碰到这种数据合并的需求很正常,我给你整理了两种实用的实现方案,分别用base R和dplyr来搞定,刚好符合你的要求👇
先确认下你的数据集(方便复现操作):
page <- c("ABC", "DDD", "DSD") freq <- c(1,33,555) df <- data.frame(page, freq) df1 <- data.frame(page = c("ABC", "DDD", "DSD", "SDSD", "vEf", "DDD"), URL = c("fakeurl1", "fakeurl2", "fakeurl3", "fakeurl4", "fakeurl5", "fakeurl6"))
方法一:Base R 实现
思路1:用match()直接匹配首次出现的URL
match()函数会返回df$page在df1$page中首次出现的位置,我们可以用这个位置从df1$URL中提取对应的链接,直接添加到df里:
# 提取每个page首次出现的URL并添加到df df$URL <- df1$URL[match(df$page, df1$page)] # 查看最终结果 df
输出结果:
page freq URL 1 ABC 1 fakeurl1 2 DDD 33 fakeurl2 3 DSD 555 fakeurl3
思路2:先去重df1再合并
如果你更习惯用merge()函数的逻辑,可以先对df1做去重处理,只保留每个page的第一条记录,再和df合并:
# 对df1去重,保留每个page的首次出现条目 df1_unique <- df1[!duplicated(df1$page), ] # 合并两个数据框,只保留df中的所有行 result <- merge(df, df1_unique, by = "page", all.x = TRUE) # 查看结果 result
这个方法的输出和思路1完全一致,适合偏好merge操作逻辑的朋友。
方法二:dplyr 实现
dplyr的语法更直观易懂,核心步骤是:先对df1去重(保留每个page的第一条记录),再用left_join()和df合并,确保df里的所有行都被保留:
library(dplyr) # 去重df1 + 合并数据框 result_dplyr <- df %>% left_join(df1 %>% distinct(page, .keep_all = TRUE), by = "page") # 查看最终结果 result_dplyr
这里distinct(page, .keep_all = TRUE)的作用是:按照page字段去重,同时保留该行的其他列(也就是对应的URL);left_join则保证df中的所有page都能匹配到对应的首次出现URL,不会丢失数据。
不管哪种方法,都能精准实现你要的“将df1中每个page首次出现的URL合并到df中”的需求~
内容的提问来源于stack exchange,提问作者BrownNation
相关产品推荐
相关产品推荐

