R语言 粘贴两个向量,并将所有向量的元素组合在一起

aydmsdu9  于 2023-04-09  发布在  其他
关注(0)|答案(9)|浏览(291)

我有两个向量:

vars <- c("SR", "PL")
vis <- c(1,2,3)

基于这些向量,我想创建以下向量:

"SR.1"  "SR.2"  "SR.3"  "PL.1"  "PL.2"  "PL.3"

使用paste,得到以下结果:

paste(vars, vis, sep=".")
 [1] "SR.1" "PL.2" "SR.3"

如何创建我需要的矢量?

piok6c0g

piok6c0g1#

你可以使用这个,但可能有一个更简单的解决方案:

R> apply(expand.grid(vars, vis), 1, paste, collapse=".")
[1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3"

expand.grid返回一个data.frame,当它与apply一起使用时,apply会将其转换为matrix。这是不必要的(并且在大数据上效率低下)。outer给出一个matrix,并且也接受函数参数。它在大数据上也会非常有效。
使用outer

as.vector(outer(vars, vis, paste, sep="."))
# [1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3"
u4vypkhs

u4vypkhs2#

另一种选择是使用repeach参数:

paste(rep(vars, each = length(vis)), vis, sep = ".")

我发现这比基于applyexpand.grid的解决方案更简单。

8ehkhllq

8ehkhllq3#

另一个使用sprintfexpand.grid的选项:

eg <- expand.grid(vis, vars)
sprintf('%s.%s', eg[,2], eg[,1])

其给出:

[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"

说明:

  • 使用expand.grid可以创建两个向量的所有组合。
  • sprintf根据指定的格式('%s.%s')将两个向量粘贴在一起。格式的每个%s部分都被向量的元素替换。
vh0rcniy

vh0rcniy4#

这个老问题已经有了一个公认的答案。但是由于它被用作欺骗目标,我相信添加一个data.table解决方案是值得的,它使用了 cross join 函数CJ()

library(data.table) 
options(datatable.CJ.names=FALSE) # required with version version 1.12.0+
CJ(vars, vis)[, paste(V1, V2, sep =".")]
#[1] "PL.1" "PL.2" "PL.3" "SR.1" "SR.2" "SR.3"

如果原始订单很重要:

CJ(vars, vis, sorted = FALSE)[, paste(V1, V2, sep =".")]
#[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"

编辑:CJ()在1.12.0版本中更改了默认行为

正如1.12.0版本的发行说明中所宣布的那样(第3点),默认选项options(datatable.CJ.names=TRUE)已经更改。CJ()现在自动命名其输入,与as data.table()完全相同。
因此,上述代码必须针对data.table版本1.12.0及更高版本进行修改:

library(data.table)   ### version 1.12.0+
CJ(vars, vis)[, paste(vars, vis, sep =".")]

CJ(vars, vis, sorted = FALSE)[, paste(vars, vis, sep =".")]

分别

k3bvogb1

k3bvogb15#

要保持问题中请求的字符串的顺序,您可以使用这两种方法的以下两个修改:
改变向量的顺序并以相反的顺序合并

apply(expand.grid(vis, vars), 1, function(x) paste(x[2], x[1], sep=".")) 
[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"

或在转换为向量之前转置矩阵:

as.vector(t(outer(vars, vis, paste, sep="."))) 
[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"
jaxagkaj

jaxagkaj6#

purrr的其他选项:

library(purrr)
cross(list(vars, vis)) %>% map_chr(paste, sep = ".", collapse = ".")
#[1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3"

我们也可以使用cross2

cross2(vars, vis) %>%  map_chr(paste, sep = ".", collapse = ".")
#[1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3"
polhcujo

polhcujo7#

从该link复制带有dplyr的选项

fruits <- tibble(
  type   = c("apple", "orange", "apple", "orange", "orange", "orange"),
  year   = c(2010, 2010, 2012, 2010, 2010, 2012),
  size  =  factor(
    c("XS", "S",  "M", "S", "S", "M"),
    levels = c("XS", "S", "M", "L")
  ),
  weights = rnorm(6, as.numeric(size) + 2)
)

所有可能的组合,即所有都被定义,但不一定存在于数据中

fruits %>% expand(type)
#> # A tibble: 2 x 1
#>   type  
#>   <chr> 
#> 1 apple 
#> 2 orange
fruits %>% expand(type, size)
#> # A tibble: 8 x 2
#>   type   size 
#>   <chr>  <fct>
#> 1 apple  XS   
#> 2 apple  S    
#> 3 apple  M    
#> 4 apple  L    
#> 5 orange XS   
#> 6 orange S    
#> 7 orange M    
#> 8 orange L    
b<-fruits %>% expand(type, size, year)
#> # A tibble: 16 x 3
#>    type   size   year
#>    <chr>  <fct> <dbl>
#>  1 apple  XS     2010
#>  2 apple  XS     2012
#>  3 apple  S      2010
#>  4 apple  S      2012
#>  5 apple  M      2010
#>  6 apple  M      2012
#>  7 apple  L      2010
#>  8 apple  L      2012
#>  9 orange XS     2010
#> 10 orange XS     2012
#> 11 orange S      2010
#> 12 orange S      2012
#> 13 orange M      2010
#> 14 orange M      2012
#> 15 orange L      2010
#> 16 orange L      2012

然后简单的粘贴

b <- fruits %>% expand(type, size, year) %>% 
     mutate(., pasted=paste(type, size, year, sep="."))
0wi1tuuw

0wi1tuuw8#

下面是使用基本R的另一个选项

vars <- c("SR", "PL"); vis <- c(1,2,3)

c(sapply(vars, \(x) paste(x, vis, sep = ".")))
[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"
brvekthn

brvekthn9#

最简单的解决方法就是

paste0(vars,".", vis)
[1] "SR.1" "PL.2" "SR.3"

相关问题