【问题标题】:R- merge two dataframes but values of ID have semicolonsR-合并两个数据框,但 ID 的值有分号
【发布时间】:2013-05-22 19:30:01
【问题描述】:

这是一个后续问题: R-合并两个数据框,但有些值中有分号 贡献者已经解决了这个问题: agstudy 。谢谢!

链接中讨论的实际数据有点复杂,我已经卡了一段时间。 这是我的数据框(df2)的样子:

myIDColumn  someName    somevalue       
AB  gsdfg   123     
CD  tfgsdfg 234     
EF  sfdgsf  365     
GH  gdfgb   53453       
IJ  sr  64564       
KL  sfsdv   4234234     
MN  ewrwe   5       
OP  dsfsss  3453        
QR  gggg    667     
ST  dss 7567        
UV  hhhhjf  55      
WX  dfadasad    8657        
YZ  ghfgh   1234        
ABC gdgfg   234455      
VCB hgjkk   5555667     

这就是我的 df1 的样子:

ID  someText    someThing       
AB  ada 12      
CD;EF;QR    dfsdf   13      
IJ  fgfgd   14      
KL  fgdg    15      
MN  gh  16      
OP;WX   jhjhj   17      
WW  ghjgjhgjghj 18      
YZ  kkl 19

这是我希望得到的输出:

我可以通过以下方式很好地合并两者:

mm <- merge(df2,df1,by.y='ID',by.x='myIDColumn',all.y=TRUE)

但之后不知道如何进一步进行。

非常感谢任何帮助。谢谢。

df1:

structure(list(ID = structure(1:8, .Label = c("AB", "CD;EF;QR", 
"IJ", "KL", "MN", "OP;WX", "WW", "YZ"), class = "factor"), someText = structure(c(1L, 
2L, 4L, 3L, 5L, 7L, 6L, 8L), .Label = c("ada", "dfsdf", "fgdg", 
"fgfgd", "gh", "ghjgjhgjghj", "jhjhj", "kkl"), class = "factor"), 
    someThing = 12:19), .Names = c("ID", "someText", "someThing"
), class = "data.frame", row.names = c(NA, -8L))

df2:

structure(list(myIDColumn = structure(c(1L, 3L, 4L, 5L, 6L, 7L, 
8L, 9L, 10L, 11L, 12L, 14L, 15L, 2L, 13L), .Label = c("AB", "ABC", 
"CD", "EF", "GH", "IJ", "KL", "MN", "OP", "QR", "ST", "UV", "VCB", 
"WX", "YZ"), class = "factor"), someName = structure(c(9L, 15L, 
12L, 5L, 14L, 13L, 4L, 2L, 7L, 3L, 11L, 1L, 8L, 6L, 10L), .Label = c("dfadasad", 
"dsfsss", "dss", "ewrwe", "gdfgb", "gdgfg", "gggg", "ghfgh", 
"gsdfg", "hgjkk", "hhhhjf", "sfdgsf", "sfsdv", "sr", "tfgsdfg"
), class = "factor"), somevalue = c(123L, 234L, 365L, 53453L, 
64564L, 4234234L, 5L, 3453L, 667L, 7567L, 55L, 8657L, 1234L, 
234455L, 5555667L)), .Names = c("myIDColumn", "someName", "somevalue"
), class = "data.frame", row.names = c(NA, -15L))

【问题讨论】:

    标签: r join merge row collapse


    【解决方案1】:

    可能有更好的方法,但您可以创建一个临时数据框:

    df1 <- structure(list(ID = c("AB", "CD;EF;QR", "IJ", "KL", "MN", "OP;WX", 
    "WW", "YZ"), someText = c("ada", "dfsdf", "fgfgd", "fgdg", "gh", 
    "jhjhj", "ghjgjhgjghj", "kkl"), someThing = 12:19), .Names = c("ID", 
    "someText", "someThing"), class = "data.frame", row.names = c(NA, 
    -8L))
    
    
    df2 <- structure(list(myIDColumn = c("AB", "CD", "EF", "GH", "IJ", "KL", 
    "MN", "OP", "QR", "ST", "UV", "WX", "YZ", "ABC", "VCB"), someName = c("gsdfg", 
    "tfgsdfg", "sfdgsf", "gdfgb", "sr", "sfsdv", "ewrwe", "dsfsss", 
    "gggg", "dss", "hhhhjf", "dfadasad", "ghfgh", "gdgfg", "hgjkk"
    ), somevalue = c(123L, 234L, 365L, 53453L, 64564L, 4234234L, 
    5L, 3453L, 667L, 7567L, 55L, 8657L, 1234L, 234455L, 5555667L)), .Names = c("myIDColumn", 
    "someName", "somevalue"), class = "data.frame", row.names = c(NA, 
    -15L))
    f <- function(x) {
        y <-  unlist(strsplit(x$ID,';'))
        data.frame(ID = x$ID, someText = x$someText, someThing = x$someThing, ID1 = y) 
    }
    library(plyr)
    df3 <- ddply(df1, .(ID), f)
    
    > df3
             ID    someText someThing ID1
    1        AB         ada        12  AB
    2  CD;EF;QR       dfsdf        13  CD
    3  CD;EF;QR       dfsdf        13  EF
    4  CD;EF;QR       dfsdf        13  QR
    5        IJ       fgfgd        14  IJ
    6        KL        fgdg        15  KL
    7        MN          gh        16  MN
    8     OP;WX       jhjhj        17  OP
    9     OP;WX       jhjhj        17  WX
    10       WW ghjgjhgjghj        18  WW
    11       YZ         kkl        19  YZ
    

    您可以将其与您的数据框 df2 合并并汇总数据:

    mm <- merge(df2,df3,by.y='ID1',by.x='myIDColumn',all.y=TRUE)
    ddply(mm, .(ID,someText, someThing), summarize,  
               somevalue = paste(somevalue, collapse=','),
                     someName = paste(someName, collapse = ","))
    
            ID    someText someThing   somevalue            someName
    1       AB         ada        12         123               gsdfg
    2 CD;EF;QR       dfsdf        13 234,365,667 tfgsdfg,sfdgsf,gggg
    3       IJ       fgfgd        14       64564                  sr
    4       KL        fgdg        15     4234234               sfsdv
    5       MN          gh        16           5               ewrwe
    6    OP;WX       jhjhj        17   3453,8657     dsfsss,dfadasad
    7       WW ghjgjhgjghj        18          NA                  NA
    8       YZ         kkl        19        1234               ghfgh
    

    【讨论】:

    • :感谢您的代码!不知何故,当我在我的实际数据集上运行您的代码时,我在输出文件中得到了以下列(按顺序): myIDCoumn someName someValue ID someText someThing
    • 并且 someName 和 someValue 列值不会以逗号折叠
    • 我有dput 我的df1df2 值。你的可能有stringsAsFactors = TRUE
    • 我对 dput 不熟悉...请您详细说明如何解决我的问题。非常感谢您帮助我。
    • dput(x) 将为您提供对象 x 的一个版本,其他人可以从中获取。我不知道您的 df1df2 包含什么,因此很难提供帮助。
    猜你喜欢
    • 2013-05-22
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    相关资源
    最近更新 更多