Paste0 奇怪的行为
Paste0 weird behaviour
我无法弄清楚为什么会发生这种情况,另一位分析师也查看了这一点,但同样感到困惑。可能与组合的数量有关,但我尝试过的变体没有帮助。
下面的语法重新创建了一些用于构建 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
您似乎想要创建所有可能的组合,但是当您使用简单的 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)
或者如果您使用 tidyverse
包中的 tidyr
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
所以那里有很多重复项。如果一个向量长度可以被另一个向量长度整除,则重复将在另一个向量的周期内重复,您将无法获得所有可能的组合
我无法弄清楚为什么会发生这种情况,另一位分析师也查看了这一点,但同样感到困惑。可能与组合的数量有关,但我尝试过的变体没有帮助。
下面的语法重新创建了一些用于构建 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
您似乎想要创建所有可能的组合,但是当您使用简单的 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)
或者如果您使用 tidyverse
包中的 tidyr
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
所以那里有很多重复项。如果一个向量长度可以被另一个向量长度整除,则重复将在另一个向量的周期内重复,您将无法获得所有可能的组合