簡體   English   中英

連接兩個具有相同列名的不完整數據表

[英]Joining two incomplete data.tables with the same column names

我有兩個不完整的 data.tables 具有相同的列名。

 dt1 <- data.table(id = c(1, 2, 3), v1 = c("w", "x", NA), v2 = c("a", NA, "c")) dt2 <- data.table(id = c(2, 3, 4), v1 = c(NA, "y", "z"), v2 = c("b", "c", NA))

它們看起來像這樣:

 dt1 id v1 v2 1: 1 wa 2: 2 x <NA> 3: 3 <NA> c
 > dt2 id v1 v2 1: 2 <NA> b 2: 3 y c 3: 4 z <NA>

有沒有辦法通過填寫缺失的信息來合並兩者?

這是我追求的結果:

 id v1 v2 1: 1 wa 2: 2 xb 3: 3 y c 4: 4 z <NA>

我嘗試了各種 data.table 連接、合並,但我要么重復列:

 > merge(dt1, + dt2, + by = "id", + all = TRUE) id v1.x v2.x v1.y v2.y 1: 1 wa <NA> <NA> 2: 2 x <NA> <NA> b 3: 3 <NA> c y c 4: 4 <NA> <NA> z <NA>

或重復的行:

 > merge(dt1, + dt2, + by = names(dt1), + all = TRUE) id v1 v2 1: 1 wa 2: 2 <NA> b 3: 2 x <NA> 4: 3 <NA> c 5: 3 y c 6: 4 z <NA>

兩個 data.tables 具有相同的列名。

您可以按 ID 分組並在省略 NA 后獲取唯一值,即

library(data.table) merge(dt1, dt2, all = TRUE)[, lapply(.SD, function(i)na.omit(unique(i))), by = id][] # id v1 v2 #1: 1 wa #2: 2 xb #3: 3 y c #4: 4 z <NA>

你也可以從 rbind() 開始:

 rbind(dt1, dt2)[, lapply(.SD, \(x) unique(x[.is,na(x)])): by = id] # id v1 v2 # <num> <char> <char> # 1: 1 wa # 2: 2 xb # 3: 3 y c # 4 4 z <NA>

首先full_join ,然后是group_by每個 id 並合並行:

 library(dplyr) library(tidyr) dt1 %>% full_join(dt2, by = c("id", "v1", "v2")) %>% group_by(id) %>% fill(starts_with('v'),.direction = 'updown') %>% slice(1) %>% ungroup

Output:

 # A tibble: 4 × 3 id v1 v2 <dbl> <chr> <chr> 1 1 wa 2 2 xb 3 3 y c 4 4 z NA

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM