Перестановка векторов символов в строке матрицы - PullRequest
3 голосов
/ 11 февраля 2020

Предположим, M имеет следующую структуру: -

> dput(head(M))
structure(list(SV = structure(c(38L, 21L, 24L, 20L, 54L, 45L), .Label = c("X1 X2 X3", 
"X1 X2 X3 X10 X6 X9", "X1 X2 X3 X10 X8 X9", "X1 X2 X3 X10 X9 X8", 
"X1 X2 X3 X4", "X1 X2 X3 X4 X9 X7", "X1 X2 X3 X5", "X1 X2 X3 X5 X10", 
"X1 X2 X3 X5 X6 X4", "X1 X2 X3 X5 X9", "X1 X2 X3 X6", "X1 X2 X3 X6 X7", 
"X1 X2 X3 X7", "X1 X2 X3 X7 X8 X10", "X1 X2 X3 X8", "X1 X2 X3 X8 X4", 
"X1 X2 X3 X8 X9 X10 X7", "X1 X2 X3 X9", "X1 X2 X3 X9 X10", "X1 X2 X3 X9 X5", 
"X2 X1 X3", "X2 X1 X3 X10", "X2 X1 X3 X10 X5", "X2 X1 X3 X10 X9", 
"X2 X1 X3 X4", "X2 X1 X3 X4 X10", "X2 X1 X3 X4 X6", "X2 X1 X3 X4 X8", 
"X2 X1 X3 X5 X10 X4", "X2 X1 X3 X5 X4", "X2 X1 X3 X5 X7", "X2 X1 X3 X6", 
"X2 X1 X3 X6 X5 X7", "X2 X1 X3 X6 X8", "X2 X1 X3 X6 X8 X9", "X2 X1 X3 X7", 
"X2 X1 X3 X7 X10", "X2 X1 X3 X7 X4", "X2 X1 X3 X7 X5", "X2 X1 X3 X7 X9 X5", 
"X2 X1 X3 X8", "X2 X1 X3 X8 X10 X4", "X2 X1 X3 X8 X10 X5 X9", 
"X2 X1 X3 X8 X6", "X2 X1 X3 X9", "X2 X1 X3 X9 X5", "X2 X1 X3 X9 X5 X4", 
"X2 X1 X3 X9 X6 X7 X10", "X2 X1 X3 X9 X7", "X2 X3 X1 X5 X6", 
"X2 X3 X1 X8", "X3 X1 X2", "X3 X2 X1", "X3 X2 X1 X4"), class = "factor")), row.names = c(NA, 
6L), class = "data.frame")

Видно, что в некоторых строках они не являются последовательными. Мне нужно появление в последовательном порядке X1 X2 X3 X4 X5 X6 X7 в этом порядке. Как мне переставить ряды M

Ответы [ 3 ]

2 голосов
/ 11 февраля 2020

Вам нужно разделить, вырезать числа и порядок, т.е.

M$SV <- sapply(M$SV, function(i){i1 <- strsplit(as.character(i), ' ')[[1]];  
                                 i2 <- i1[order(as.numeric(gsub('\\D+', '', i1)))]; 
                                 paste(i2, collapse = ' ')})

, что дает,

               SV
1  X1 X2 X3 X4 X7
2        X1 X2 X3
3 X1 X2 X3 X9 X10
4  X1 X2 X3 X5 X9
5     X1 X2 X3 X4
6     X1 X2 X3 X9
1 голос
/ 11 февраля 2020
M$SV <- as.character(M$SV)
M$SV <- sapply(
  strsplit(M$SV, " "),
  function(x) {
    y <- x[order(as.integer(sub("X", "", x, fixed = TRUE)))]
    paste(y, collapse = " ")
  }
)
M


#                SV
# 1  X1 X2 X3 X4 X7
# 2        X1 X2 X3
# 3 X1 X2 X3 X9 X10
# 4  X1 X2 X3 X5 X9
# 5     X1 X2 X3 X4
# 6     X1 X2 X3 X9
0 голосов
/ 11 февраля 2020

попробуйте это с помощью транспонирования и примените:

M <- data.frame(a=c("z1","z1"),
                b=c("z5","z4"),
                c=c("z2","z3"),
                d=c("z6","z2"))

>t(apply(M, 1, sort))
     [,1] [,2] [,3] [,4]
[1,] "z1" "z2" "z5" "z6"
[2,] "z1" "z2" "z3" "z4"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...