5

我有以下问题,我可以解决:

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”,“A” )。所以排序是在每个单元格内。

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”和列名“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

怎么能命令(每对变量的短)?

4

1 回答 1

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
于 2012-07-28T01:40:31.200 回答