矩阵的每个列中的反转元素,而不反转col顺序

时间:2017-04-11 03:53:54

标签: r

使用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" 

3 个答案:

答案 0 :(得分: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"  

答案 1 :(得分:0)

我们可能需要一些字符串操作。假设原始数据集中只有3个字符,我们可以在(.)中将每个字符捕获为一个组(sub)并反转捕获组的顺序(`\ 3 \ 2 \ 1&#39; )

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,])

答案 2 :(得分: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