使用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.matrix1,,]中的错误:下标超出界限
我想得到的是:
[,1] [,2] [,3]
snips "ACC" "CTA" "CTT"
row2 "1" "2" "3" 发布于 2017-04-11 04:05:55
一种方法是使用字符串操作包之一,比如“string i”来反转字符串:
library(stringi)
my.matrix[1, ] <- stri_reverse(my.matrix[1, ])
my.matrix
# [,1] [,2] [,3]
# snips "ACC" "CTA" "CTT"
# row2 "1" "2" "3" 发布于 2017-04-11 03:56:00
我们可能需要一些字符串操作。假设原始数据集中只有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" 一种更普遍的方法是将字符串拆分为单个字符,然后将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,])发布于 2017-04-11 04:07:36
你可以用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。
https://stackoverflow.com/questions/43336468
复制相似问题