有条件地联接多个表,而不是创建新的列

我有三个要加入的数据框。困难在于我希望替换同一列中的冲突值,而不是创建新行。我尝试过left_join和full_join的不同变体,然后是滤镜。

示例数据帧:

df.0 <- 
 ID SEQUENCE    FIXDT.0 FIXU.0           SEX
  3        0 2010-08-01        Spayed Female
  1        0 2011-10-01        Neutered Male
  2        0                1  Spayed Female
  5        0 2012-05-01        Neutered Male

df.1_2 <- 
 ID SEQUENCE    FIXDT.0 FIXU.0           SEX
  3        1 2010-10-01        Spayed Female
  1        1                1  Neutered Male
  4        2                1  Spayed Female
  5        1 2012-05-01        Neutered Male

df.3_6 <-
 ID SEQUENCE    FIXDT.0 FIXU.0           SEX
  6        3 2011-08-01        Neutered Male
  1        6 2012-10-01        Neutered Male
  4        4 2010-02-01        Spayed Female
  5        3 2012-05-01        Neutered Male

df.cohort <-
 ID    SEX.STATUS   BIRTH.DATE  ENROLLED.DATE
  1  Neutered Male  8/23/2010    12/11/2012
  2  Spayed Female  6/16/2011     9/11/2013
  3  Spayed Female  9/28/2011      9/6/2013 
  4  Spayed Female  6/26/2011      1/2/2013
  5  Neutered Male  4/15/2011      7/5/2012
  6  Neutered Male  5/12/2010     8/16/2011
  7  Intact Male    2/17/2011    10/25/2012

我想将它们与下面所需的输出结合在一起。我的想法是将它们连接在一起,并用下一个连接表中的值替换以前的值。另一个需要注意的重要事项是,如果可能的话,我希望在输出中指定FIXDT的日期。这将意味着替换某些行,而不替换其他行

df.full <-
 ID    SEX.STATUS   BIRTH.DATE  ENROLLED.DATE            Sex   FIXDT       FIXU  SEQUENCE
  1  Neutered Male  8/23/2010    12/11/2012    Neutered Male   2011-10-01              0
  2  Spayed Female  6/16/2011     9/11/2013    Spayed Female                 1         0
  3  Spayed Female  9/28/2011      9/6/2013    Spayed Female   2010-08-01              0
  4  Spayed Female  6/26/2011      1/2/2013    Spayed Female   2010-02-01              4
  5  Neutered Male  4/15/2011      7/5/2012    Neutered Male   2012-05-01              0
  6  Neutered Male  5/12/2010     8/16/2011    Neutered Male   2011-08-01              3
  7  Intact Male    2/17/2011    10/25/2012    

我知道此make需要一些中间data.frames,并且也尝试过这种方法。我尝试使用dplyrfilter,但意识到这些方法最适合相等的联接,并且我尝试进行不相等的联接。

java21710397 回答:有条件地联接多个表,而不是创建新的列

对于您的加入问题,这应该可以解决。这意味着您想完全替换共享列,这似乎正是您想要的

library('dplyr')

special_join <- function(x,y,by,...) {

    shared_cols <- colnames(x) [colnames(x) %in% colnames(y) & !colnames(x) %in% by]
    x[,shared_cols] <- NULL                                                                                                        

    full_join(x,...)

}

a <- data.frame(ID = 1:4,variable=c('a','b','c','d'),other_variable=4:7)                                                      
b <- data.frame(ID = 1:3,variable=c('z','x','y'))

special_join(a,b,by='ID')
#   ID other_variable variable                                                                                                       
# 1  1              4        z                                                                                                     
# 2  2              5        x
# 3  3              6        y                                                                                                      
# 4  4              7     <NA>
,

在清理了一些数据之后,我尝试使用上面答案中的代码。但是,最终效果最好的是一个明智的选择。

1)将每个df与同类群组合并,然后将其子集合并以只保留一只使用不同的狗。例如df.1_2:

df.1_2_join <- left_join(df.1_2,cohort,by="DOGID")
df.1_2_join <- df.1_2_join[order(df.1_2_join$SEQUENCE),]
df.1_2_join <- df.1_2_join %>% distinct(DOGID,.keep_all = TRUE)

2)进行更改,以便所有对应的列名都匹配。

3)在所有列中进行full_join

4)按顺序对完整的data.frame进行排序,然后再次使用distinct来删除重复的ID。

在此过程中,我还了解到duplicated2是有用的函数,用于写入数据帧中所有重复行的列表,而不仅仅是它们的2,3或更多外观。我用它来检查并确保所有ID均未重复且信息正确。

本文链接:https://www.f2er.com/3155758.html

大家都在问