【问题标题】:how can I combine based on one column and make them unique at the same time如何基于一列组合并同时使它们独一无二
【发布时间】:2019-03-20 16:48:44
【问题描述】:

我有许多数据集,我想将它们合并并使其独一无二。我想在这里做一个有代表性的数据

df1 <- read.table(text="info   var1 var2
1       C001        mytest1       NA
2       C002        mytest2       NA
3       C003  myse1        data1
4       C004        NA       NA
5       C007 where1        India
6       C010 ohio        city
11      C016 number        fifty
12      C017 city        rome", header=T, stringsAsFactors=F)

and this

df2 <- read.table(text="info   var1  var2
1      C003 myse1 data1
2      C007 where1 India
3      C010 ohio city
4      C016 number        fifty
5      C017 city        rome
6      C022 country India
7      C023 number 10", header=T, stringsAsFactors=F)

df3 <- read.table(text="info   var1  var2 var3
1      C017 city        rome  ind
2      C022 country India     bes
3      C027 this  there  NA", header=T, stringsAsFactors=F)

我想根据信息将它们组合在一起,但要使其独一无二。 当我想合并所有文件时,我会这样做

library(tidyverse)
library(dplyr)
list(df1, df2, df3) %>% reduce(full_join, by = "info")

但我希望输出是这样的

info    var1.x  var2.x  var3
C001    mytest1 NA  NA
C002    mytest2 NA  NA
C003    myse1   data1   NA
C004    NA  NA  NA
C007    where1  India   NA
C010    ohio    city    NA
C016    number  fifty   NA
C017    city    rome    ind
C022    country India   bes
C023    number  10  NA
C027    this    there   NA

【问题讨论】:

  • bind_rows(df3, df2, df1) %&gt;% distinct(info, .keep_all = TRUE)?
  • @Frank 您的解决方案有效。我很好奇它是否会始终保留信息最多的行(例如称为 CO17 的行),或者您是否必须像我的解决方案中那样明确地这样做。
  • 是的,它只是根据 bind_rows (df3 > df2 > df1) 的参数顺序保留行。如果规则更复杂,可能需要其他东西,也许是coalesce 函数(我不太了解)。或者,在绑定之后,也许您可​​以计算缺失值、排序,然后使用distinct
  • @Frank 好的,谢谢。我会在这种情况下发布我的解决方案,因为它更通用。不过没那么漂亮。
  • @hmhensen 啊,以为你是 OP,之前没有注意到你的答案。是的,这是更可靠的方法。

标签: r


【解决方案1】:

我认为这应该适合你。

bind_rows(df1, df2, df3) %>% 
  unique() %>% 
  mutate(rsum = rowSums(!is.na(.))) %>%
  group_by(info) %>%  
  filter(rsum == max(rsum)) %>% 
  select(-rsum)

   info  var1    var2  var3 
   <chr> <chr>   <chr> <chr>
 1 C001  mytest1 <NA>  <NA> 
 2 C002  mytest2 <NA>  <NA> 
 3 C003  myse1   data1 <NA> 
 4 C004  <NA>    <NA>  <NA> 
 5 C007  where1  India <NA> 
 6 C010  ohio    city  <NA> 
 7 C016  number  fifty <NA> 
 8 C023  number  10    <NA> 
 9 C017  city    rome  ind  
10 C022  country India bes  
11 C027  this    there <NA> 

【讨论】:

    【解决方案2】:

    以下解决方案首先生成您寻求将数据集合并在一起的唯一键,即共享的“信息”列。然后使用左连接合并从 df1 和 df2 中的 var1、df1 和 df2 中的 var2 以及 df3 中的 var3 添加相应的列

    library(dplyr)
    info <- data.frame(info=unique(c(df1$info,df2$info,df3$info)))
    var1s <- unique(rbind(df1[,c("info","var1")],df2[,c("info","var1")],df3[,c("info","var1")]))
    var2s <- unique(rbind(df1[,c("info","var2")],df2[,c("info","var2")],df3[,c("info","var2")]))
    var3s <- unique(df3[,c("info","var3")])
    merge(x=info,y=var1s,by="info",all.x=T) %>% merge(y=var2s,by="info",all.x=T) %>% merge(y=var3s,by="info",all.x=T)
    

    结果:

    > merge(x=info,y=var1s,by="info",all.x=T) %>% merge(y=var2s,by="info",all.x=T) %>% merge(y=var3s,by="info",all.x=T)
       info    var1  var2 var3
    1  C001 mytest1  <NA> <NA>
    2  C002 mytest2  <NA> <NA>
    3  C003   myse1 data1 <NA>
    4  C004    <NA>  <NA> <NA>
    5  C007  where1 India <NA>
    6  C010    ohio  city <NA>
    7  C016  number fifty <NA>
    8  C017    city  rome  ind
    9  C022 country India  bes
    10 C023  number    10 <NA>
    11 C027    this there <NA>
    

    【讨论】:

      猜你喜欢
      • 2021-10-21
      • 2014-05-23
      • 1970-01-01
      • 2013-06-04
      • 2014-10-19
      • 2015-12-22
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      相关资源
      最近更新 更多