Character-Matrix-如何按行操作?

问题描述 投票:2回答:3

我有一个字符数据矩阵

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"     

您能告诉我更直接的方法以获得此答案吗?

r matrix text-mining
3个回答
1
投票

由于具有矩阵,因此可以按行使用applytrimws删除前导/后缀空格

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

或删除空值并粘贴。

apply(charMatrix, 1, function(x) paste(x[x!=''], collapse = ' '))

2
投票

我们可以通过将base R转换为matrix并使用data.framepaste来使用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的问题是直接应用该功能。两种解决方案都可以做到这一点。


0
投票

您可以使用tidyverse轻松完成它:

library(tidyverse)

charMatrix %>% 
  as_tibble() %>%
  unite("Var", sep = " ") %>% 
  mutate(Var = str_trim(Var)) %>% 
  pull()
© www.soinside.com 2019 - 2024. All rights reserved.