在矢量中划分值

时间:2018-03-19 15:06:24

标签: r

我的任务是:

  

编写一个函数,计算第一个向量中包含的值可被第二个向量中包含的值整除的次数。

     

该函数接受输入:

     

一个(第一个)数字向量,比如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)

2 个答案:

答案 0 :(得分:0)

如果这是一项任务,我可能不应该提供完整的解决方案,但您可以使用purrr来计算其中的一部分。

library(purrr)

您可以使用以下内容获取vec2vec1中的值除以所有值的向量:

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