Символьная матрица - как работать с строкой? - PullRequest
2 голосов
/ 28 мая 2020

У меня есть матрица символьных данных

charMatrix <- structure(c("Bolt", "Nut Plate", "Magnet", "", "Clevis", "welded", 
     "", "Receptacle"), .Dim = c(4L, 2L))

[,1]            [,2]        
[1,] "Bolt"      "Clevis"    
[2,] "Nut Plate" "welded"    
[3,] "Magnet"    ""          
[4,] ""          "Receptacle"

Я хочу paste строки вместе и trim их, чтобы получить вектор.

[1] "Bolt Clevis" "Nut Plate welded" "Magnet" "Receptacle"

Я решил это таким образом, но я думаю, что должно быть что-то гораздо более простое, либо в Base R, либо в Tidyverse.

vec <- charMatrix %>% t() %>% 
  as_tibble(.name_repair = "universal") %>% 
  summarise_all(~ str_trim(paste(., collapse = " "))) %>% 
  unlist() %>% 
  as.character()

vec
[1] "Bolt Clevis"      "Nut Plate welded" "Magnet"           "Receptacle"     

Не могли бы вы показать мне более прямой способ получить этот ответ?

Ответы [ 3 ]

2 голосов
/ 28 мая 2020

Мы можем использовать base R, преобразовав matrix в data.frame и использовать paste с do.call

trimws(do.call(paste, as.data.frame(charMatrix)))
#[1] "Bolt Clevis"      "Nut Plate welded" "Magnet"           "Receptacle"  

do.call векторизован и будет быстрее по сравнению с циклом .


Или используя простое подмножество и paste

trimws(paste(charMatrix[,1], charMatrix[,2]))

Оба вектора векторизованы. Вопрос OP заключается в том, чтобы применить функцию напрямую. Оба решения делают это.

1 голос
/ 28 мая 2020

Поскольку у вас есть матрица, вы можете использовать apply и trimws по строкам, чтобы удалить начальные / конечные пробелы

trimws(apply(charMatrix, 1, paste, collapse = ' '))
#[1] "BoltClevis"      "Nut Platewelded" "Magnet"          "Receptacle"     

Или удалите пустые значения и вставьте.

apply(charMatrix, 1, function(x) paste(x[x!=''], collapse = ' '))
0 голосов
/ 29 мая 2020

Это легко сделать с помощью tidyverse:

library(tidyverse)

charMatrix %>% 
  as_tibble() %>%
  unite("Var", sep = " ") %>% 
  mutate(Var = str_trim(Var)) %>% 
  pull()
...