列和名称中的分隔字符
问题描述:
我想分隔字符。虽然我有一个很大的数据框来工作,但下面的小例子展示了需要完成的工作。列和名称中的分隔字符
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
答
在这里你去:
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
答
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的问题和感谢。
感谢您的及时回复,看起来好像还有与在M1a中处理NA有关的问题,第三行中的M1b应该是NA和NA(不是NA和A) – jon
我在您的前几秒评论。请再试一次。 – Andrie
谢谢你;太好了! – jon