我的任务是:
编写一个函数,计算第一个向量中包含的值可被第二个向量中包含的值整除的次数。
该函数接受输入:
一个(第一个)数字向量,比如
vector_dividend
;一个(第二个)数字向量,比如
vector_divider
;该函数返回:
一个数字,表示vector_divisnd中的值可被vector_divisor中的值整除的次数。
例如,如果vector_dividend=[11,13,21,15,20]
和vector_divider=[3,5]
,则结果为4,因为:21和15可被3整除; 15和20可以被5整除。
这是我提出的但无法执行的内容 任何形式的帮助将不胜感激,谢谢
vec1 <- c(10,2,3,6,20)
vec2 <- c(6,2)
div <- function(x,y){
i<-1
for(i in 1:length(x)){
if(x[i] / y[i] || y[i+1] != 1)
add <- i
i=i+1
}
return(i)
}
div(vec1,vec2)
答案 0 :(得分:0)
如果这是一项任务,我可能不应该提供完整的解决方案,但您可以使用purrr
来计算其中的一部分。
library(purrr)
您可以使用以下内容获取vec2
中vec1
中的值除以所有值的向量:
map_lgl(vec2, ~ all(vec1 %% .x == 0))
或vec2
中的vec1
中的任何值的值,如下所示:
map_lgl(vec2, ~ any(vec1 %% .x == 0))
如果你想计算它们,那么你可以使用其中一个:
sum(map_lgl(vec2, ~ all(vec1 %% .x == 0)))
sum(map_lgl(vec2, ~ any(vec1 %% .x == 0)))
答案 1 :(得分:0)
此行不起作用:
if(x[i] / y[i] || y[i+1] != 1)
在R中,有一个%%
运算符(函数)可以像这样使用并给你一个布尔值:
x[i] %% y[j] == 0
因此,如果您想保留您的功能,我们可以这样写:
div <- function(x,y){
count <- 0
for(i in 1:length(x)){
for(j in 1:length(y)){
if(x[i] %% y[j] == 0){
count = count + 1
} else
{count = count}
}
}
return(count)
}
所以
div(vec1,vec2)
# [1] 5
根据需要。
然而,正如@PoGibas在对@ThomasMailund的回答中所提到的那样,在基数R中有更好的替代方案。
正如@PoGibas所提到的,你可以改写:
count_divs <- function(vec1, vec2) sum(sapply(vec1, function(x) x %% vec2 == 0))
count_divs(vec1, vec2)
有趣的是,div
函数在您的用例中的效果优于count_divs
。