Предполагая, что показаны пробелы NA
, получите количество элементов NA в строке с помощью rowSums
, cbind
rep
выделенного первого столбца на основе 'n', а t
перенесите остальную часть столбцы после исключения NA
s
n <- rowSums(!is.na(m1[,-1]))
cbind(rep(m1[,1], n), na.omit(c(t(m1[,-1]))))
# [,1] [,2]
#[1,] "A" "1"
#[2,] "A" "2"
#[3,] "A" "3"
#[4,] "B" "1"
#[5,] "B" "4"
#[6,] "C" "3"
Или более компактный вариант - реплицировать первый столбец с индексом col
, cbind
с t
смещением остальных столбцов и, наконец, удалить строки NA с помощью na.omit
na.omit(cbind(m1[,1][col(m1[,-1])], c(t(m1[,-1]))))
# [,1] [,2]
#[1,] "A" "1"
#[2,] "A" "2"
#[3,] "A" "3"
#[4,] "B" "1"
#[5,] "B" "4"
#[6,] "C" "3"
ПРИМЕЧАНИЕ. matrix
не может иметь несколько типов столбцов. Итак, если есть класс символов, все элементы конвертируются в character
данные
m1 <- structure(c("A", "B", "C", "1", "1", "3", "2", "4", NA, "3",
NA, NA), .Dim = 3:4)