使用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 :(得分: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"
更通用的方法是将字符串拆分为单个字符,然后rev
和paste
将其分开
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。