Как преобразовать матрицу в таблицу в r

#r #dataframe #matrix

Вопрос:

Предположим, у меня есть такая матрица

 > main<-matrix(c(1,4,5,7,NA,NA,NA,NA,3,6,12,3,45,NA,NA,NA,5,9,12,14,3,9,7,2),nrow=3,byrow = TRUE)
> main
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    4    5    7   NA   NA   NA   NA
[2,]    3    6   12    3   45   NA   NA   NA
[3,]    5    9   12   14    3    9    7    2
 

Я хочу создать таблицу из 2 столбцов и 3 строк, как это:

 
  Topic_no        Object/Transcript
  Topic 1          1, 4, 5, 7
  Topic 2          3, 6, 12, 3, 45
  Topic 3          5, 9, 12, 14, 3, 9, 7, 2
 

Как я могу это сделать?

Ответ №1:

В base R цикле по строкам матрицы с apply элементами и MARGIN = 1 , paste не являющимися элементами NA в виде строки , создайте два столбца data.frame с этим, а также столбец последовательности, созданный для «Topic_no»

 data.frame(Topic_no = paste('Topic', seq_len(nrow(main))), 
        Object_Transcript =  apply(main, 1, function(x) 
            toString(x[complete.cases(x)])))
 

-выход

  Topic_no        Object_Transcript
1  Topic 1               1, 4, 5, 7
2  Topic 2          3, 6, 12, 3, 45
3  Topic 3 5, 9, 12, 14, 3, 9, 7, 2
 

Комментарии:

1. Вы так быстро, и я удаляю свой ответ 🙂

2. Ха-ха, я собирался опубликовать свой ответ, но обнаружил, что ваш уже там, поэтому я отменил его.

3. @akrun Спасибо вам, ответ был полезен. Можете ли вы помочь с другой вещью, предположим, мне нужна таблица, в которой первый столбец назван как объект/расшифровка(значения в столбцах являются одинарными, и они похожи на 1, 2,3,…), а во втором столбце мы хотим знать, какая тема принадлежит этой расшифровке/объекту.

Ответ №2:

Вот решение с unite помощью tidyr :

  1. матрица, с которой можно возиться as_tibble()
  2. используется unite для объединения всех столбцов в один с аргументом remove = TRUE
  3. Удалите все символы после последней запятой
  4. мутировать Topic колонку
 library(tidyr)
library(dplyr)
main %>% 
  as_tibble() %>% 
  unite(`Object/Transcript`, V1:V8, sep = ",", remove = TRUE) %>% 
  mutate(`Object/Transcript` = sub("(\d)[^0-9] $", "\1", `Object/Transcript`)) %>%   
  mutate(Topic_no = paste0("Topic ", row_number()), .before=1)
 

Выход:

   Topic_no `Object/Transcript`
  <chr>    <chr>              
1 Topic 1  1,4,5,7            
2 Topic 2  3,6,12,3,45        
3 Topic 3  5,9,12,14,3,9,7,2