2013-05-27 2 views
2
내 데이터 프레임 (DF1)의

하나는이 같은 열이 내 DF1에 따라 dataframes을 병합하고 싶지만 내가 어떻게이 paticular 가입을에 세미콜론의 문제 를 해결할 수R- 두 개의 데이터 프레임을 병합하지만 일부 값이이 값에 세미콜론을

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 

이 매우 큰 데이터 테이블)입니다. 정규식을 사용하여 이러한 데이터 프레임에 참여할 수 있습니까?

내 원하는 출력 :

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

2 단계에서, 게시 된 용액과 유사하지만 더 압축 방식 :

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)) 

여기서 출력 (BTW mrg가 매트릭스이다)이다. ";"

  1. 는 2 data.frame이어서
  2. 함유 행 변환 병합 여기에 코드

는 :

##step1 
mm <- merge(df2,df1,by.y='ID',by.x='myIDColumn',all.y=TRUE) 
## step2 
rr <- do.call(rbind,lapply(strsplit(mm$myIDColumn[grep(';',mm$myIDColumn)],';'), 
     function(x){ 
      res <- paste(df2[df2$myIDColumn==x[1],], 
        df2[df2$myIDColumn==x[2],], 
        sep=',') 
      res[1] <- paste(x,collapse=';') 
      res})) 
mm[grep(';',mm$myIDColumn),] <- rr 

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   WW   <NA>  <NA> 
8   YZ   ghfgh  1234 
+0

이 코드를 제공해 주셔서 감사합니다. 내 실제 데이터를 시도 할 때 다음 오류가 발생합니다 : strsplit 오류 (mm $ UniProtID [grep ("$"UniProtID)] ";") : 문자가 아닌 인수 – RnD

+1

시도해 보셨습니까? 'mm $ UniProtID <- as.character (mm $ UniProtID)' – agstudy

+0

감사합니다. 문제가 해결되었지만 추가로 디버깅 할 때이 오류가 발생합니다 :'[<-. data.frame' ("* tmp *', grep ("; ", mm $ UniProtID), 값 = c ("P05386; P05387 ", : 대체품은 6 개 항목 필요 10 – RnD

2

df1을 두 개의 새로운 데이터 프레임 (보통은 df2 정렬로 병합하고, 세미콜론은 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) 
4

다음은 압축 솔루션입니다. 두 개의 정수를 하나의 요소에 저장하는 다른 방법이 없으므로 모든 필드가 문자로 변환됩니다. df2$miIDColumn에 누락 된 df1$ID에 값이있는 경우 "character(0)" 값이 표시됩니다.

 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" 
+0

나는 여기에'foreach' 패키지를 사용한다고 가정합니다. 또한 ";" ID를 ','로 묶습니다. +1 때문에이 솔루션을 찾았습니다. – agstudy

관련 문제