2012-07-27 14 views
5

Tôi đã sau vấn đề, tôi có thể giải quyết:trật tự trong khi tách (. Ví dụ TA nên được chia cho hai cột "A" trong lần đầu tiên "T" thứ hai) trong 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 

Tôi muốn chia hai chữ cái vào cột khác, và sau đó đặt hàng theo thứ tự bảng chữ cái.

Chỉnh sửa: Đặt hàng có thể được thực hiện trước khi chia nhỏ, ví dụ var1a giá trị "TA" var1a phải là "AT" hoặc sau khi chia để var1aa phải là "A" và var1ab là "T" (thay vì "T" , "A"). để sắp xếp nằm trong mỗi ô.

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

chia mỗi cột và kết hợp

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 

Nhưng phần chưa được giải quyết là tôi muốn đặt hàng các cặp cột như vậy mà columnname "a" và columname "b" được sắp xếp, theo thứ tự abc. Do đó, sản lượng được mong đợi:

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 

Làm cách nào để đặt hàng (viết tắt với mỗi cặp biến)?

+0

Bạn có nghĩa là mỗi hàng trong mỗi cặp cột cần phải được đặt theo thứ tự abc? Nếu trường hợp đó xảy ra, bạn nên thêm tuyên bố đó vào câu hỏi của mình vì câu hỏi này rất không rõ ràng. – joran

+0

Các câu hỏi như nó đứng là không mạch lạc. Khung dữ liệu được tạo bởi mã không khớp với ví dụ bạn cung cấp. Chỉ có 2 'T' trong dữ liệu mã. Hơn nữa, bản chất của hoạt động "theo thứ tự bảng chữ cái" không rõ ràng. Bạn có muốn đặt hàng theo cột đầu tiên theo thứ tự reverese –

+0

Hàm 'split_col' của bạn cho tôi một lỗi:' Lỗi trong is.character (mẫu): 'mẫu' bị thiếu ' –

Trả lời

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: Nếu tên rất quan trọng, bạn có thể thay thế chúng:

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 
Các vấn đề liên quan