2012-07-27 45 views
5

我有以下问题(如:TA应当分拆为两个栏,“A”,在第一个“T”第二),我可以解决:为了在分裂中的R

set.seed (1234) 
mydf <- data.frame (var1a = sample (c("TA", "AA", "TT"), 5, replace = TRUE), 
        varb2 = sample (c("GA", "AA", "GG"), 5, replace = TRUE), 
        varAB = sample (c("AC", "AA", "CC"), 5, replace = TRUE) 
        ) 
    mydf 

    var1a varb2 varAB 
1 TA AA CC 
2 AA GA AA 
3 AA GA AC 
4 AA AA CC 
5 TT AA AC 

我想分裂的两个字母进入不同的栏目,然后按字母顺序排列。例如var1a值“TA”var1a应该是“AT”或者在分割之后使得var1aa应该是“A”,并且var1ab是“T”(而不是“T”)。 , “一个”)。 所以排序是在每个单元格内。

split_col <- function(.col, data){ 
    .x <- colsplit(data[[.col]], names = paste0(.col, letters[1:2])) 
    } 

分每一列,并结合

require(reshape) 
    splitdf <- do.call(cbind, lapply(names(mydf), split_col, data = mydf)) 

var1aa var1ab varb2a varb2b varABa varABb 
1  T  A  A  A  C  C 
2  A  A  G  A  A  A 
3  A  A  G  A  A  C 
4  A  A  A  A  C  C 
5  T  T  A  A  A  C 

但尚未解决的部分是我要订购一对列,使得列名“a”和columname“B”是有序的,按字母顺序。因此预期输出:

var1aa var1ab varb2a varb2b varABa varABb 
1  A  T  A  A  C  C 
2  A  A  A  G  A  A 
3  A  A  A  G  A  C 
4  A  A  A  A  C  C 
5  T  T  A  A  A  C 

如何可以订购(短与每对变量的)?

+0

你的意思是,在每对列的每行必须按字母顺序排序?如果是这样的话,你应该把这个陈述加入你的问题中,因为它很不明确。 – joran 2012-07-28 00:34:31

+0

现在的问题是不连贯的。代码创建的数据框与您提供的示例不匹配。代码数据中只有2个'T'。此外,“按字母顺序排列”操作的性质还不清楚。你想按照顺序排列第一列 – 2012-07-28 00:38:17

+0

你的'split_col'函数给了我一个错误:'错误is.character(模式):'pattern'丢失' – 2012-07-28 00:43:29

回答

5
mylist <-as.list(mydf) 

splits <- lapply(mylist, reshape::colsplit, names=c("a", "b")) 
rowsort <- lapply(splits, function(x) t(apply(x, 1, sort))) 
comb <- do.call(data.frame, rowsort) 
comb 

    var1a.1 var1a.2 varb2.1 varb2.2 varAB.a varAB.b 
1  A  T  A  A  C  C 
2  A  A  A  G  A  A 
3  A  A  A  G  A  C 
4  A  A  A  A  C  C 
5  T  T  A  A  A  C 

编辑: 如果名称是重要的,你可以替换他们:

replaceNums <- function(x){ 
    .which <- regmatches(x, regexpr("[[:alnum:]]*(?=.)", x, perl=TRUE)) 
    stopifnot(length(x) %% 2 == 0) #checkstep 
    paste0(.which, c("a", "b")) 
} 

names(comb) <- replaceNums(names(comb)) 
comb 
    var1aa var1ab varb2a varb2b varABa varABb 
1  A  T  A  A  C  C 
2  A  A  A  G  A  A 
3  A  A  A  G  A  C 
4  A  A  A  A  C  C 
5  T  T  A  A  A  C