我有两个向量:
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"
如何创建我需要的载体?
我有两个向量:
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"
如何创建我需要的载体?
您可以使用此,但有可能是一个简单的解决方案:
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"
用另一种选择sprintf
与组合expand.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
格式的一部分由所述向量的元素代替。 另一种选择是使用each
的说法rep
:
paste(rep(vars, each = length(vis)), vis, sep = ".")
我觉得这比基于解决方案的简单apply
或expand.grid
。
为了保持在这一问题请求字符串的顺序,你可以用两种方法这两个修改:
变动矢量的顺序,以相反的顺序结合
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"
这个老问题已经有一个公认的答案。 但是,因为它是被用来作为欺骗的目标,我认为这是值得添加data.table
它使用交叉连接功能的解决方案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 =".")]
RESP。