假设我有以下数据:
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的功能。
任何帮助将不胜感激!
答案 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