簡體   English   中英

合並具有相同ID的行並刪除重復的行

[英]Combine rows with same id and delete duplicated rows

合並一些數據后,每個ID有多行。 如果數據不同,我只想保留多個SAME ID。 NA值應視為等於任何逐個數據點。

數據:

df <- structure(list(id = c(1L, 2L, 2L, 2L, 3L, 3L, 4L, 4L, 4L, 5L), 
    v1 = structure(c(1L, 1L, NA, 1L, 1L, 1L, 1L, NA, 1L, 1L), .Label = "a", class = "factor"), 
    v2 = structure(c(1L, 2L, 2L, 3L, 1L, 1L, 1L, 1L, NA, 1L), .Label = c("a", 
    "b", "c"), class = "factor"), v3 = structure(c(1L, 1L, 1L, 
    1L, 1L, 1L, NA, 2L, 2L, 1L), .Label = c("a", "b"), class = "factor")), .Names = c("id", 
"v1", "v2", "v3"), row.names = c(NA, -10L), class = "data.frame")

看起來像:

   id   v1   v2   v3
    1    a    a    a
    2    a    b    a
    2 <NA>    b    a
    2    a    c    a
    3    a    a    a
    3    a    a    a
    4    a    a <NA>
    4 <NA>    a    b
    4    a <NA>    b
    5    a    a    a

所需的輸出:

   id   v1   v2   v3
    1    a    a    a
    2    a    b    a
    2    a    c    a
    3    a    a    a
    4    a    a    b
    5    a    a    a

如果存在一個data.table解決方案,那就很data.table

使用data.table可能解決方案:

library(data.table)
setDT(df)[, lapply(.SD, function(x) unique(na.omit(x))), by = id]

這使:

  id v1 v2 v3 1: 1 aaa 2: 2 aba 3: 2 aca 4: 3 aaa 5: 4 aab 6: 5 aaa 

首先將所有NA替換為相應的列值,然后查找唯一值

library(data.table)
dt<-as.data.table(df)
for (j in seq_len(ncol(dt)))
     set(dt,which(is.na(dt[[j]])),j,dt[[j]][1]) #please feel to change dt[[j]][1] to na.omit(dt[[j]])[1] . It is a tradeoff between performance and perfection
unique(dt)
 id v1 v2 v3
1:  1  a  a  a
2:  2  a  b  a
3:  2  a  c  a
4:  3  a  a  a
5:  4  a  a  a
6:  4  a  a  b
7:  5  a  a  a

暫無
暫無

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

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