2012-07-27 12 views
5

(例えばTAは、第二の二列最初の「T」の「A」に分割する必要があります。)私はこの問題を次のようしている、私は解決することができながら:私は2つの文字を分割したいため分割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" 、 "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 

を兼ね備えしかし未解決の部分は、私は、このようなColumnNameに「」と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

+0

それは立て続けの問題はインコヒーレントです。コードによって作成されたデータフレームは、提供するサンプルと一致しません。コードデータには2つの 'T'しかありません。さらに、「アルファベット順」操作の性質は不明である。あなたは聖杯の最初の列で注文しますか –

+0

'split_col'関数が私にエラーを出します:' is.character(pattern)のエラー: 'pattern' is missing ' –

答えて

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 

EDIT: 名前が重要な場合は、それらを交換することができます

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