我已经看过这个了,我不太明白为什么这会给我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
答案 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)
可以使用head
和tail
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
的总和后完成元素已完成。