字符矩阵——如何按行操作?
Character-Matrix - how to operate by row?
我有一个字符数据矩阵
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"
你能告诉我一个更直接的方法来得到这个答案吗?
我们可以通过将 matrix
转换为 data.frame
来使用 base R
,并使用 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 的问题是直接应用该功能。两种解决方案都可以做到这一点。
因为你有一个矩阵,你可以使用 rowwise apply
和 trimws
来删除 leading/trailing 空格
trimws(apply(charMatrix, 1, paste, collapse = ' '))
#[1] "BoltClevis" "Nut Platewelded" "Magnet" "Receptacle"
或删除空值并粘贴。
apply(charMatrix, 1, function(x) paste(x[x!=''], collapse = ' '))
您可以使用 tidyverse 轻松完成:
library(tidyverse)
charMatrix %>%
as_tibble() %>%
unite("Var", sep = " ") %>%
mutate(Var = str_trim(Var)) %>%
pull()
我有一个字符数据矩阵
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"
你能告诉我一个更直接的方法来得到这个答案吗?
我们可以通过将 matrix
转换为 data.frame
来使用 base R
,并使用 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 的问题是直接应用该功能。两种解决方案都可以做到这一点。
因为你有一个矩阵,你可以使用 rowwise apply
和 trimws
来删除 leading/trailing 空格
trimws(apply(charMatrix, 1, paste, collapse = ' '))
#[1] "BoltClevis" "Nut Platewelded" "Magnet" "Receptacle"
或删除空值并粘贴。
apply(charMatrix, 1, function(x) paste(x[x!=''], collapse = ' '))
您可以使用 tidyverse 轻松完成:
library(tidyverse)
charMatrix %>%
as_tibble() %>%
unite("Var", sep = " ") %>%
mutate(Var = str_trim(Var)) %>%
pull()