摆脱附加字符向量的循环

时间:2017-07-06 09:08:19

标签: r loops vector

我是R的新手,但在EViews中有一些编码经验。从我在这个网站上阅读的帖子中,我知道循环通常可以用R中更快的代码替换。 所以,这是我的问题:我想在R中获得一个字符向量。每个"字符"将是由国家/地区代码和变量组成的变量名称。 所以如果我有两个国家和三个变量,我需要一个2x3 = 6个字符的向量。 这是我提出的代码:

spark-submit

非常感谢您的帮助

1 个答案:

答案 0 :(得分:3)

以下应该做你想要的。 R中的许多函数已经被矢量化(例如paste),这意味着如果向量长度不匹配,它们接受向量并使用R的常用重用/重复规则执行元素操作。

# Define your toy data (as character vectors)
allb <- c("a", "b", "c")
cty <- c("fr", "us")

# Get all combinations
all.comb <- expand.grid(x = allb, y = cty)

# Combine columns of generated matrix
list_pgo <- paste0(all.comb$x, "pgo", all.comb$y, "_id")
print(list_pgo)
#[1] "apgofr_id" "bpgofr_id" "cpgofr_id" "apgous_id" "bpgous_id" "cpgous_id"

编辑:当然存在其他方法和方法,但已经被矢量化的函数通常比可以认为是&#34;循环隐藏&的函数的apply-family快得多。 #34;仅

将上述内容与评论中的单行内容进行比较:

library("microbenchmark")

fun1 <-function() {
  all.comb <- expand.grid(x = allb, y= cty)
  paste0(all.comb$x,"pgo",all.comb$y,"_id")
}

fun2 <- function() {
  apply(expand.grid(allb,cty), 1, function(x) paste(x[1],"pgo",x[2],"_id",sep=""))
}

microbenchmark(fun1(), fun2())
#Unit: microseconds
#   expr    min       lq     mean   median      uq      max neval
# fun1()  88.80 136.7705 185.3204 150.1570 163.098 3722.469   100
# fun2() 246.32 286.9275 353.2598 305.8925 326.419 4920.156   100