使用所有向量元素的组合粘贴两个向量

时间:2013-04-22 09:30:15

标签: r r-faq

我有两个向量:

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"

如何创建我需要的载体?

6 个答案:

答案 0 :(得分:66)

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

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"

答案 1 :(得分:10)

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部分都被向量的元素替换。

答案 2 :(得分:9)

另一种选择是使用each的{​​{1}}参数:

rep

我发现这比基于paste(rep(vars, each = length(vis)), vis, sep = ".") apply的解决方案更直接。

答案 3 :(得分:8)

要维护问题中请求的字符串的顺序,您可以对这两种方法使用以下两种修改:

更改矢量顺序并按相反顺序组合

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"

或在转换为vector之前转置矩阵:

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

答案 4 :(得分:8)

这个老问题已经有了一个公认的答案。但是,由于它被用作欺骗目标,我认为添加使用交叉连接函数data.table的{​​{1}}解决方案是值得的:< / p>

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" 已更改版本1.12.0的默认行为

正如release notes of version 1.12.0(第3点)所述,默认选项CJ()已更改。 options(datatable.CJ.names=TRUE)现在正确地为其输入CJ()自动命名。

因此,上述代码必须针对as data.table()版本1.12.0及更高版本进行修改:

data.table

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

RESP。

答案 5 :(得分:1)

带有print (dict(zip(list1, list2))) {'A': 'Z1', 'B': 'Z3', 'C': 'Z4', 'D': 'Z8'} print (df1.rename(columns=dict(zip(list1, list2)))) Z1 Z3 Z4 Z8 0 94 18 47 1 1 75 40 30 97 2 14 56 63 89 3 28 74 25 59 的其他选项:

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