在R中进行连续行计算

时间:2015-10-06 13:57:58

标签: r

假设我有以下数据:

a<- c(1:10)
b<- c(10:1)

现在我想在两行(a和b)上进行连续计算(在本例2中为可变长度)并将输出保存在两个单独的列表(a和b)中。

  

计算应如下所示:

     

表示:

     

(1 + 2)/ 2; (2 + 3)/ 2; (3 + 4)/ 2; ...; (9 + 10)/ 2

     b的

(相同)

     

(10 + 9)/ 2; (9 + 8)/ 2; (8 + 7)/ 2; ...;(2 + 1)/ 2

a
1,5 2,5 3,5 ... 9,5
b
9,5 8,5 7,5 ... 1,5

我在StackOverflow中找到了这个功能:

v <- c(1, 2, 3, 10, 20, 30)
grp <- 3

res <- sapply(1:(length(v)-grp+1),function(x){sum(v[x:(x+grp-1)])})

这几乎可以满足我的需求,但我更喜欢不使用sapply而只使用基础R的功能。 任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:5)

你可以做R

f = function(x) (head(x,-1) + tail(x,-1))/2

list(a=f(a), b=f(b))
#$a
#[1] 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5

#$b
#[1] 9.5 8.5 7.5 6.5 5.5 4.5 3.5 2.5 1.5

或者如果您想使用apply系列:

library(zoo)

list(a=rollapply(a,2, mean), b=rollapply(b,2, mean))

sapply 确实不推荐,但是如果你想使用它(仅用于测试!):

sapply(1:(length(a)-1), function(i) mean(a[i:(i+1)]))
#[1] 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5
#same for b

答案 1 :(得分:3)

na.omit(filter(a, c(1,1))/2)
na.omit(filter(b, c(1,1))/2)

答案 2 :(得分:1)

你可以试试这个:

d1 <- ((a + a[seq(a)+1])/2)[-length(a)]
#[1] 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5

d2 <- ((b + b[seq(b)+1])/2)[-length(b)]
#[1] 9.5 8.5 7.5 6.5 5.5 4.5 3.5 2.5 1.5

最后一部分[-length(a)][-length(b)]会删除序列末尾的NA条目。

答案 3 :(得分:0)

如果class PlayerAI { void computeSomething(list of argument, Object& output) { // some logic } } a的长度相同

b

或者为两个

写两个不同的循环
for(i in 1:(length(a) - 1))
{
 list1[i] <- (a[i] + a[i+1])/2
 list2[i] <- (b[i] + b[i+1])/2
}
> list1
#[1] 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5

> list2
#[1] 9.5 8.5 7.5 6.5 5.5 4.5 3.5 2.5 1.5