Как переместить значения каждого столбца в матрице в R - PullRequest
0 голосов
/ 01 июня 2019

Я ищу общий способ сделать следующее, У меня есть треугольная матрица nxn, например:

a NA NA
b  d NA
c  e f

и преобразовать его в:

a d f
b e NA
c NA NA

Идея такова: для каждого столбца перемещайте значения, пока первое не-значение NA не окажется в первой строке

Я полагаю, что это делается с помощью for, для каждого столбца, чтобы он увеличивался, но я не знаю, как это сделать ...

Ответы [ 2 ]

2 голосов
/ 01 июня 2019

Вот способ с пользовательской функцией -

m <- structure(c("a", "b", "c", NA, "d", "e", NA, NA, "f"), .Dim = c(3L, 
3L), .Dimnames = list(NULL, c("V1", "V2", "V3")))

custom_shift <- function(x) {
  y <- x[!is.na(x)]
  length(y) <- length(x)
  y
}

apply(m, 2, function(a) custom_shift(a))

     V1  V2  V3 
[1,] "a" "d" "f"
[2,] "b" "e" NA 
[3,] "c" NA  NA 
0 голосов
/ 01 июня 2019

Редактировать: Исправлено, чтобы не сортировать значения:

apply(m, 2, function(x) x[order(is.na(x))])

Оригинал: Другое решение, которое использует sort(..., na.last = T) и подходит для сортировки каждого столбца:

m <- structure(c("a", "b", "c", NA, "d", "e", NA, NA, "f"), .Dim = c(3L, 
                                                                     3L), .Dimnames = list(NULL, c("V1", "V2", "V3")))

apply(m, 2, sort, na.last = T )

     V1  V2  V3 
[1,] "a" "d" "f"
[2,] "b" "e" NA 
[3,] "c" NA  NA 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...