Paste0奇怪的行为

时间:2018-03-14 13:02:53

标签: r paste

在我的生活中无法弄清楚为什么会发生这种情况,另一位分析师也对此进行了调查,并且同样难以理解。可能与组合的数量有关,但我尝试的变化没有帮助。

下面的语法重新创建了构建API调用的一些语法示例。我有一个域名列表和一个国家列表,它将这些组合在一起(即“bbc.com - UK”,“bbc.com - Spain”,“bbc.com - Poland”。国家代码是2位数的ISO代码,在下面的示例中,域是随机文本。

出于某种原因,当112个域名与7个国家/地区合并时,每个域名都会被授予一个国家/地区,即“”bbc.com - UK“,”bbc.com - UK“,”bbc.com - UK“。我添加了两个国家,如第二个例子,这是有效的。改变域的数量也使它工作。

domains <- data.frame(Domain=paste(stri_rand_strings(112, 5, pattern = "[A-Za-z0-9]"),".com"))

###DOES NOT WORK
country <- data.frame(country=rep(c("au","be","fr","nl","pl","ch","us"),nrow(domains)))                  

###DOES WORK
country <- data.frame(country=rep(c("au","be","fr","nl","pl","ch","us","aa","aa"),nrow(domains)))   


APICall <- paste0('https://api.abc.com/website/',domains$Domain,"/start_date=","2017-03",'&end_date=',"2018-02","&country=",country$country)
APICall <- transform(APICall,Domain=gsub(".*website/","",APICall))
APICall$Domain<- gsub("/.*","",APICall$Domain)
APICall <- transform(APICall,Country=strtrim(gsub(".*&country=","",APICall$X_data),2))
APICall <- transform(APICall,Date=strtrim(gsub(".*/start_date=","",APICall$X_data),7))

我有一个解决方法(添加两个“aa”国家/地区),但我真的想知道最新情况......

系统信息:R 3.3.2 R Studio版本1.0.143 OS Sierra 10_12_3

1 个答案:

答案 0 :(得分:1)

您似乎想要创建所有可能的组合,但是当您使用简单的rep()时,无法保证您将创建所有可能的组合。

如果你从两个简单的向量开始

domains <- paste(stringi::stri_rand_strings(112, 5, pattern = "[A-Za-z0-9]"),".com")
countries <- c("au","be","fr","nl","pl","ch","us")

您可以使用expand.grid

获得所有可能的组合
expand.grid(domains, countries)

或者如果您使用tidyr个套件中的tidyverse

tidyr::crossing(domains, countries)

仅使用rep()不会给出所有组合。例如

x <- letters[1:10]
y <- rep(letters[21:25], length(x))
comb <- paste(x,y)

请注意

length(comb)
# [1] 50
length(unique(comb))
# [1] 10

因此有很多重复。如果一个向量长度可以被另一个整除,则重复将在另一个的周期内重复,并且您不会获得所有可能的组合