2

私のデータ フレーム (df1) の 1 つには、次のような列があります。

ID
AB
CD;EF
IJ
KL
MN
OP;WX
WW
YZ

もう 1 つのデータ フレーム (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    someName    somevalue
AB    gsdfg   123
CD;EF tfgsdfg,sfdgsf  234,365
IJ    sr  64564
KL    sfsdv   4234234
MN    ewrwe   5
OP;WX dsfsss,dfadasad 3453,8657
WW        
YZ    dfadasad    8657
TT

どんな助けでも本当に感謝しています。ありがとう!

4

3 に答える 3

4

これがコンパクトなソリューションです。1 つの要素に 2 つの整数を格納する他の方法がないため、すべてのフィールドが文字に変換されることに注意してください。df1$IDに欠落している値がある場合は、そこに値をdf2$miIDColumn取得し"character(0)"ます。

IDs <- strsplit(df1$ID, ";")
mrg <- foreach(x=IDs, .combine=rbind) %do% {
    pieces <- lapply(x, function(y) df2[df2$myIDColumn %in% y,])
    do.call(paste, c(pieces, list(sep=",")))
}
dimnames(mrg) <- list(NULL, colnames(df2))

出力mrgは次のとおりです(ところで、行列です):

     myIDColumn     someName          somevalue   
[1,] "AB"           "gsdfg"           "123"       
[2,] "CD,EF"        "tfgsdfg,sfdgsf"  "234,365"   
[3,] "IJ"           "sr"              "64564"     
[4,] "KL"           "sfsdv"           "4234234"   
[5,] "MN"           "ewrwe"           "5"         
[6,] "OP,WX"        "dsfsss,dfadasad" "3453,8657" 
[7,] "character(0)" "character(0)"    "integer(0)"
[8,] "YZ"           "ghfgh"           "1234"   
于 2013-05-27T09:39:20.720 に答える
2

これは、2 つの新しいデータフレームに分離することを含む戦略ですdf1(1 つは通常の並べ替えにマージするdf2もので、もう 1 つはセミコロンID値を持ち、処理が困難です)。

l <- grep(";",df1$ID) # semicolon lines
nl <- which(!grepl(";",df1$ID)) # non-semicolon lines

# merge non-semicolon lines
newdfA <- merge(df1[nl,],df2,all.x=TRUE)

# merge semicolon lines
tmpdf1 <- df1[l,]
split <- strsplit(tmpdf1$ID,";")

### This seems sloppy, but should work
newdfB <- data.frame(t(sapply(split, FUN=
    function(x){
    tmprows <- df2[df2$ID %in% x,]
    return(c(   paste0(tmprows[,1],collapse=";"),
            paste0(tmprows[,2],collapse=","),
            paste0(tmprows[,3],collapse=",") ))
    } )))
colnames(newdfB) <- c("ID","someName","someValue")

# merge everything back together
newdf <- merge(newdfA, newdfB, all=TRUE)
于 2013-05-27T09:23:07.450 に答える