附加了R和向量长度NA值的问题

时间:2018-09-24 03:05:09

标签: r vector

我已经看过这个了,我不太明白为什么这会给我NA值附加到我想要的向量上的问题。在下面提示:

“该函数应返回一个向量,其中第一个元素是输入向量的前n个元素的总和,其余向量是输入向量的其他元素的副本。例如,如果输入向量是(2, 3, 6, 7, 8)n = 2,则输出应该是向量(5, 6, 7, 8)

 testA<- c(1,2,3,4,5)    
myFunction <- function(vector1, n)
       {
       sum1=0
       for(i in 1:n)
         {
          sum1<-sum1+vector1[i]
          newVector<-c(sum1,vector1[n+1:length(vector1)])
         }
       return(newVector)
         }

print(newVector) 
myFunction(testA, 3)

输出为:[1] 6 4 5 NA NA NA,当它应为6 4 5

5 个答案:

答案 0 :(得分:1)

这里不需要test <- c(2, 3, 6, 7, 8) myfunction <- function(x, n) c(sum(x[1:n]), x[-(1:n)]) myfunction(test, 2) #[1] 5 6 7 8 testA <- c(1,2,3,4,5) myfunction(testA, 3) #[1] 6 4 5 循环; 您可以执行类似的操作

sum(x[1:n])

说明:n计算x的前x[-(1:n)]个元素的总和,x返回n并删除前class X(op: (Int, Int) => Int, i: Int*) {} val x = X(_ + _, 5) 个元素

答案 1 :(得分:0)

可以使用headtail

n <- 2
c(sum(head(test, 2)), tail(test, -2))
#[1] 5 6 7 8

数据

test <- c(2, 3, 6, 7, 8)

答案 2 :(得分:0)

在这里,我尝试比较以上两个功能的效率,这两个功能分别是答案发布https://stackoverflow.com/a/52472214/3806250和问题发布。

> testA <- 1:5    
> myFunction <- function(vector1, n) {
+        sum1 <- 0
+        for(i in 1:n) {
+           sum1 <- sum1 + vector1[i]
+           newVector <- c(sum1, vector1[n+1:length(vector1)])
+          }
+        newVector <- newVector[!is.na(newVector)]
+        return(newVector)
+        }
> 
> microbenchmark::microbenchmark(myFunction(testA, 3))
Unit: microseconds
                 expr   min     lq     mean median    uq     max neval
 myFunction(testA, 3) 3.592 4.1055 77.37798  4.106 4.619 7292.85   100
> 
> myfunction <- function(x, n) c(sum(x[1:n]), x[-(1:n)])
> 
> microbenchmark::microbenchmark(myfunction(testA, 2))
Unit: microseconds
                 expr   min   lq     mean median    uq      max neval
 myfunction(testA, 2) 1.539 1.54 47.04373  2.053 2.053 4462.644   100

答案 3 :(得分:0)

谢谢大家的回答!昨晚我真的很累,无法提出这个简单的解决方案:

    function(vector1, n)
  {
  sum1=0
  for(i in 1:n) #scans input vector from first element to input 'n' element
    {
    sum1<-sum1+vector1[i]#Find sum of numbers scanned 
    newVector<-c(sum1,vector1[n+1:length(vector1)])#new output vector starting with the sum found then concatonates rest of the original vector after 'n' element
    length(newVector)<-(length(newVector)-(n)) #NA values were returned, length needs to be changed with respect to 'n'
  }
  return(newVector)
  print(newVector)
}

答案 4 :(得分:0)

已经有不错的解决方案,但这是另一个对原始代码进行最少修改的选项:

testA<- c(1,2,3,4,5)    
myFunction <- function(vector1, n)
{
  sum1=0
  for(i in 1:n)
  {
    sum1<-sum1+vector1[i]
  }

  newVector<-c(sum1,vector1[(n+1):length(vector1)]) # we take this line out of the for loop
  # and put the n+1 in between parenthesis

  return(newVector)
}
newVector <- myFunction(testA, 3)
print(newVector) 

原始代码/示例中的问题是,n+1:length(vector1)可能会返回[1] 4 5,以便进行适当的子集设置(获取向量中未包含在向量中的最后一个元素)。前n个元素的总和),但实际上返回的是[1] 4 5 6 7 8。由于6:8中位置testA中没有元素,因此这就是出现缺失值/ NA的原因。

n+1:length(vector1)的实际作用是首先获得安全性1:length(vector1),然后将n添加到每个元素。这是使用值的这种行为的示例:

3+1:5
#> [1] 4 5 6 7 8

我们可以通过在原始代码的括号之间加上n+1来解决此问题。在我们使用值的示例中:

(3+1):5
#> [1] 4 5

此外,将newVector的分配移出循环可提高性能,因为sum1与子集向量之间的绑定仅需要在第一个n的总和后完成元素已完成。