2012-07-27 54 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