#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
:
- матрица, с которой можно возиться
as_tibble()
- используется
unite
для объединения всех столбцов в один с аргументомremove = TRUE
- Удалите все символы после последней запятой
- мутировать
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