2011-11-01 158 views
4

我想分隔字符。雖然我有一個很大的數據框來工作,但下面的小例子展示了需要完成的工作。列和名稱中的分隔字符

mydf <- data.frame (name = c("L1", "L2", "L3"), 
    M1 = c("AC", "AT", NA), M2 = c("CC", "--", "TC"), M3 = c("AT", "TT", "AG")) 

我要爲變量M1字符分割到M3(實時數據集我> 6000個變量)

name M1a M1b M2a M2b M3a M3b 
    L1 A C C C A  T 
    L2 A T - - T  T 
    L3 NA NA T  C A  G 

我嘗試了以下代碼:

func<- function(x) {sapply(strsplit(x, ""), 
        match, table= c("A","C","T","G", "--", NA))} 

odataframe <- data.frame(apply(mydf, 1, func)) 
colnames(odataframe) <- paste(rep(names(mydf), each = 2), c("a", "b"), sep = "") 
odataframe 

回答

3

在這裏你去:

splitCol <- function(x){ 
    x <- as.character(x) 
    x[is.na(x)] <- "$$" 
    z <- matrix(unlist(strsplit(x, split="")), ncol=2, byrow=TRUE) 
    z[z=="$"] <- NA 
    z 
} 


newdf <- as.data.frame(do.call(cbind, lapply(mydf[, -1], splitCol))) 
names(newdf) <- paste(rep(names(mydf[, -1]), each=2), c("a", "b"), sep="") 
newdf <- data.frame(mydf[, 1, drop=FALSE], newdf) 

newdf 
    name M1a M1b M2a M2b M3a M3b 
1 L1 A C C C A T 
2 L2 A T - - T T 
3 L3 <NA> <NA T C A G 
+0

感謝您的及時回覆,看起來好像還有與在M1a中處理NA有關的問題,第三行中的M1b應該是NA和NA(不是NA和A) – jon

+0

我在您的前幾秒評論。請再試一次。 – Andrie

+0

謝謝你;太好了! – jon

1

Andrie' S碼的複製功能

splitCol <- function(dataframe, splitVars=names(dataframe)){ 
split.DF <- dataframe[,splitVars] 
keep.DF <- dataframe[, !names(dataframe) %in% c(splitVars)] 

X <- function(x)matrix(unlist(strsplit(as.character(x), split="")), ncol=2, byrow=TRUE) 

newdf <- as.data.frame(do.call(cbind, suppressWarnings(lapply(split.DF, X)))) 
names(newdf) <- paste(rep(names(split.DF), each=2), c(".a", ".b"), sep="") 
data.frame(keep.DF,newdf) 
} 

測試出來

splitCol(mydf) 
splitCol(mydf, c('M1','M2')) 

請不要投這是正確的答案。安德里的回答顯然是第一個正確答案。這只是他的代碼擴展到更多情況。謝謝你的代碼Andrie的問題和感謝。

相關問題