3

Suppose M has the following structure:-

> 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")

It can be seen that in some rows they are not consecutive. I need the appearance in a consecutive order X1 X2 X3 X4 X5 X6 X7 in this order. How can I rearrange the rows of M

user642080
  • 99
  • 6

3 Answers3

2

You need to split, strip the numbers and order, i.e.

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

which gives,

               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
Sotos
  • 51,121
  • 6
  • 32
  • 66
1
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
s_baldur
  • 29,441
  • 4
  • 36
  • 69
0

try this using transponse and apply:

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"
norimg
  • 96
  • 3