Question

Consider the following example (values in vectors are target practice results and I'm trying to automagically sort by shooting score). We generate three vectors. We sort values in columns 1:20 in ascending order and rows in descending order based on out.tot column.

# Generate data
shooter1 <- round(runif(n = 20, min = 1, max = 10))
shooter2 <- round(runif(n = 20, min = 1, max = 10))
shooter3 <- round(runif(n = 20, min = 1, max = 10))
out <- data.frame(t(data.frame(shooter1, shooter2, shooter3)))
colnames(out) <- 1:ncol(out)

out.sort <- t(apply(out, 1, sort, na.last = FALSE))
out.tot <- apply(out , 1, sum)
colnames(out.sort) <- 1:ncol(out.sort)
out2 <- cbind(out.sort, out.tot)

out3 <- apply(out2, 2, sort, decreasing = TRUE, na.last = FALSE)

out2 has row names attached while out3 lost them. The only difference is that I used MARGIN = 2, which is probably the culprit (because it takes in column by column). I can match rows by hand, but is there a way I can keep row names in out3 from disappearing?

> out2
         1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 out.tot
shooter1 1 2 2 3 3 3 4 5 5  5  6  6  6  6  6  7  8  9  9 10     106
shooter2 1 3 3 3 3 4 4 4 5  5  5  5  5  6  7  8  8  9  9 10     107
shooter3 1 1 2 2 2 3 3 4 5  5  5  6  6  6  6  7  8  8  8  9      97

> out3
     1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 out.tot
[1,] 1 3 3 3 3 4 4 5 5  5  6  6  6  6  7  8  8  9  9 10     107
[2,] 1 2 2 3 3 3 4 4 5  5  5  6  6  6  6  7  8  9  9 10     106
[3,] 1 1 2 2 2 3 3 4 5  5  5  5  5  6  6  7  8  8  8  9      97
Was it helpful?

Solution

If I understand your example, going from out2 to out3 you are sorting each column independently - meaning that the values on row 1 may not all come from the data generated from shooter1. It makes sense then that the rownames are dropped in as much as rownames are names of observations and you are no longer keeping data from one observation on one row.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top