2015-12-18 2 views
1

У меня есть несколько файлов со следующей структурой:Транспонирования и перегруппировки строк в матрице

data <- matrix(c(1:100000), nrow=1000, ncol=100) 

Первые 500 строк являются координаты X и конечных 500 строк являются Y координат нескольких объектов контуров. Строка № 1 (X) и строка 501 (Y) соответствуют координатам одного и того же объекта. Мне нужно:

  • транспонировать всю матрицу и упорядочить ее так, что теперь строка 1 является столбцом 1, а строка 501 является столбцом 2 и имеет парные координаты x, y в смежных столбцах. Строка 2 и строка 502 должны быть в столбце 1 и столбце 2 ниже данных предыдущего объекта.
  • В идеале, у вас есть дополнительная колонка с информацией о имени файла.

спасибо.

+2

Всегда лучше показать небольшой пример вместо большого набора данных, чтобы он стал легче тестировать. – akrun

+0

Не будет ли имя файла повторяться 50000 раз, если матрица находится только из одного файла? Сохраните имя файла в отдельном объекте или с матрицей в списке. – Bazz

ответ

-1

насчет

n <- 500 
df <- data.frame(col1 = data[1:n, ], 
       col2 = data[(nrow(data) - 500):nrow(data), ], 
       fileinfo = "this is the name of the file...") 
+2

Как насчет тестирования вашего решения перед публикацией? –

0

Simpler версия:

транспонировать матрицу, а затем создать вектор с индексами столбцов и подмножество с ними:

mat <- matrix(1:100, nrow = 10) 
mat2 <- t(mat) 
cols <- unlist(lapply(1:(nrow(mat2)/2), function(i) c(i, i+nrow(mat2)/2))) 
mat3 <- mat2[,cols] 

Тогда просто сделать его dataframe как показано ниже.


Вы можете Подмножество пары строк, разделенных nrow/2, сделать их матрицу 2-колонки, а затем cbind их всех:

df <- as.data.frame(do.call(cbind, lapply(1:(nrow(mat)/2), function(i) { 
    matrix(mat[c(i, nrow(mat)/2 + i),], ncol = 2, byrow = TRUE) 
}))) 
df 
# V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 fname 
# 1 1 6 2 7 3 8 4 9 5 10  a 
# 2 11 16 12 17 13 18 14 19 15 20  e 
# 3 21 26 22 27 23 28 24 29 25 30  e 
# 4 31 36 32 37 33 38 34 39 35 40  o 
# 5 41 46 42 47 43 48 44 49 45 50  y 
# 6 51 56 52 57 53 58 54 59 55 60  q 
# 7 61 66 62 67 63 68 64 69 65 70  v 
# 8 71 76 72 77 73 78 74 79 75 80  b 
# 9 81 86 82 87 83 88 84 89 85 90  v 
# 10 91 96 92 97 93 98 94 99 95 100  y 

Затем просто добавить новый столбец по мере необходимости, так как это теперь dataframe:

df$fname <- sample(letters, nrow(df), TRUE) 
+0

Не забудьте переместить 'mat <- matrix (1: 100, nrow = 10)' в верхней части сообщения, иначе ваш добавленный код не удастся. –

+0

@Pascal Действительно, спасибо за его исправление. – Molx

-1

Попробуйте ответ Давида, но этот путь:

n <- 500 
df <- data.frame(col1 = data[1:n, ], 
       col2 = data[(nrow(data) - (n-1)):nrow(data), ], 
       fileinfo = "this is the name of the file...") 
+0

Он дает неверные результаты. –

Смежные вопросы