我有两个向量:
vars <- c("SR", "PL")
vis <- c(1,2,3)
Run Code Online (Sandbox Code Playgroud)
基于这些向量,我想创建以下向量:
"SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"
Run Code Online (Sandbox Code Playgroud)
随着paste我有以下结果:
paste(vars, vis, sep=".")
[1] "SR.1" "PL.2" "SR.3"
Run Code Online (Sandbox Code Playgroud)
如何创建我需要的矢量?
jub*_*uba 73
你可以使用它,但可能有一个更简单的解决方案:
R> apply(expand.grid(vars, vis), 1, paste, collapse=".")
[1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3"
Run Code Online (Sandbox Code Playgroud)
expand.grid给出一个data.frame与其一起使用的apply,apply将其转换为a matrix.这是不必要的(对大数据来说效率低).outer给出一个matrix并且也接受函数参数.它对大数据也很有效.
使用outer:
as.vector(outer(vars, vis, paste, sep="."))
# [1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3"
Run Code Online (Sandbox Code Playgroud)
小智 13
另一种选择是使用以下each参数rep:
paste(rep(vars, each = length(vis)), vis, sep = ".")
Run Code Online (Sandbox Code Playgroud)
我发现这比基于apply或的解决方案更直接expand.grid.
Jaa*_*aap 12
另一种选择sprintf与expand.grid:
eg <- expand.grid(vis, vars)
sprintf('%s.%s', eg[,2], eg[,1])
Run Code Online (Sandbox Code Playgroud)
这使:
[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"
Run Code Online (Sandbox Code Playgroud)
说明:
expand.grid你创建两个向量的所有组合.sprintf根据指定的格式('%s.%s')将两个向量粘贴在一起.%s格式的每个部分都由向量的元素替换.要维护问题中请求的字符串的顺序,可以对这两种方法使用以下两种修改:
改变向量的顺序并以相反的顺序组合
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"
Run Code Online (Sandbox Code Playgroud)
或在转换为向量之前转置矩阵:
as.vector(t(outer(vars, vis, paste, sep=".")))
[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"
Run Code Online (Sandbox Code Playgroud)
这个老问题已经有了一个公认的答案.但由于它被用作欺骗目标,我认为添加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"
Run Code Online (Sandbox Code Playgroud)
如果原始订单很重要:
CJ(vars, vis, sorted = FALSE)[, paste(V1, V2, sep =".")]
#[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"
Run Code Online (Sandbox Code Playgroud)
CJ()已更改版本1.12.0的默认行为正如版本1.12.0(第3点)的发行说明中所宣布的那样,默认选项options(datatable.CJ.names=TRUE)已更改.CJ()现在自动命名其输入as data.table().
因此,上述代码必须针对data.table1.12.0及更高版本进行修改:
library(data.table) ### version 1.12.0+
CJ(vars, vis)[, paste(vars, vis, sep =".")]
Run Code Online (Sandbox Code Playgroud)
和
CJ(vars, vis, sorted = FALSE)[, paste(vars, vis, sep =".")]
Run Code Online (Sandbox Code Playgroud)
RESP.
其他一些选项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"
Run Code Online (Sandbox Code Playgroud)
我们还可以使用cross2
cross2(vars, vis) %>% map_chr(paste, sep = ".", collapse = ".")
#[1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28213 次 |
| 最近记录: |