2017-04-11 75 views
1

使用R,我想將每列中的所有元素反轉爲矩陣的單個行。我可以將行順序反轉(這不是我想要的),但不是行中的元素。矩陣的每列中的反向元素不反轉列順序

創建例如矩陣

snips <- c("CCA", "ATC", "TTC") 
row2 <- 1:3 
my.matrix <- as.matrix(rbind(snips, row2)) 
my.matrix 

[,1] [,2] [,3] 

snips "CCA" "ATC" "TTC" 
row2 "1" "2" "3" 

反轉的行中的元素=剪

my.matrix.reversed <- rev(my.matrix[my.matrix[1,], ]) 

錯誤my.matrix [my.matrix [1],] :下標越界

我想得到的是:

[,1] [,2] [,3] 
snips "ACC" "CTA" "CTT" 
row2 "1" "2" "3" 

回答

0

我們可能需要一些字符串操作。假設僅存在3中的原始數據集的字符,我們可以在sub捕獲每個字符作爲一組((.))和反向捕獲組的順序('\ 3 \ 2 \ 1' )

my.matrix[1,] <- sub("(.)(.)(.)", "\\3\\2\\1", my.matrix[1,]) 
my.matrix 
#  [,1] [,2] [,3] 
#snips "ACC" "CTA" "CTT" 
#row2 "1" "2" "3" 

更通用的方法是使用字符串分割成單個字符,然後revpaste

my.matrix[1,] <- sapply(strsplit(my.matrix[1,], ""), function(x) paste(rev(x), collapse="")) 

或者Biostrings

library(Biostrings) 
my.matrix[1,] <- reverse(my.matrix[1,]) 
1

一種方法是使用字符串處理軟件包之一,像「stringi」扭轉字符串:

library(stringi) 
my.matrix[1, ] <- stri_reverse(my.matrix[1, ]) 
my.matrix 
#  [,1] [,2] [,3] 
# snips "ACC" "CTA" "CTT" 
# row2 "1" "2" "3" 
+0

謝謝!絃樂做了我所需要的。 – MycoP

0

你可以使用stringi::stri_reverse。這段代碼假設唯一的另一行是row2,它只包含單個字符,所以反轉並不重要。如果不是這種情況,則需要將該功能僅應用於snips行。

library(stringi) 
apply(my.matrix, 1:2, function(x) stri_reverse(x)) 

     [,1] [,2] [,3] 
snips "ACC" "CTA" "CTT" 
row2 "1" "2" "3" 

很多其他解決方案at this question