R合併資料框有重複匹配時只保留第一行

2022-06-17 10:06:14 字數 1778 閱讀 9299

合併資料框有重複匹配時通常會返回所有的匹配,如何只保留匹配的第一行呢?其實這個需求也很常見。如晶元探針id和基因id往往多對一,要合併id對應矩陣和晶元表達矩陣時。

data = data.frame(id = c(1,2,3,4,5),

state = c("ks","mn","al","fl","ca"))

scores = data.frame(id = c(1,1,1,2,2,3,3,3),

score = c(66,75,78,86,85,76,75,90))

資料長這樣:

想要這樣的結果:

試了不少方法,以下都是達不到需求的:

dplyr::left_join(data,scores,by="id")

dplyr::inner_join(data,scores,by="id")

dplyr::left_join(data, scores, by="id", match="first")

merge(data, scores, by = "id")

dplyr::semi_join(data, scores, by = "id")

#distinct去重

dplyr::left_join(data, dplyr::distinct(scores, id, .keep_all = t))

data %>% dplyr::left_join(dplyr::distinct(scores, id, .keep_all = t)) %>%

tidyr::replace_na(replace = list("score"=0l)) #替換na

通過網上查詢,找到了如下實現方式:

require(data.table)

setdt(scores); setdt(data) # convert to data.tables by reference

scores[data, mult = "first", on = "id", nomatch=0l]

#注意兩者順序

data[scores, mult = "first", on = "id", nomatch=0l] #達不到要求

merge(data, aggregate(score ~ id, data=scores, head, 1), by="id")
merge(data, scores[!duplicated(scores$id),], by="id")
#return also those which found no match

tt #return only those which found a match

tt[!is.na(tt$score),]

個人最鍾意第一種方法,因為data.table真的適合處理大資料,相比於join和merge等快了不少,幾千萬個基因探針我用join處理的話要很久很久,而且佔的記憶體超級大。data.table幾分鐘就處理完了。

不過data.table的語法感覺怪怪的,所以一直沒去學,看來要好好學習一下了。

R語言中的資料框合併

兩個資料框有相同和不同列 合併 id c 1,2,3,4 name c a b c d score c 60,70,80,90 student1 data.frame id,name student2 data.frame id,score total student1 merge student1...

R 資料框操作

1.按條件提取某些樣本 data subj age presentation product choice 1 1 m 21 absdiff pillow y 2 1 m 21 absdiff table y 3 1 m 21 absdiff helmet y 4 1 m 21 absdiff ne...

R語言資料框

資料框的建立 通過data.frame函式來建立資料框,該函式包含的主要引數為 data.frame row.names null,check.rows false,check.names true,stringsasfactors default.stringsasfactors 建立乙個資料框 ...