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

2 つの文字を別の列に分割し、アルファベット順に並べたいと思います。

編集: 順序付けは、分割前に行うことができます。たとえば、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 に答える