[问题] 一维阵列相临值取平均的实作

楼主: andrew43 (讨厌有好心推文后删文者)   2015-07-24 00:28:26
[问题类型]: 程式咨询
[软件熟悉度]: 使用者
[问题叙述]: 想写一个 function 自动求出相邻元素之平均(或其它统计量)
我想做出一个 funciton,可以做相邻值的统计量或套用特定的 function。
目前想到的参数有
1. x: 来源 numeric vector
2. n: 取几个相邻元素
3. FUN: 想套用的统计量或 function
我的第一个困难是,在头和在尾的元素在取相邻元素会有例外。
例如 1:3 的第一个元素是 1,但它没有上一个元素,
所以就只能往之后的元素纳入。
如果是用 for loop,里头做例外处理,
我还办得到,但不知道有没有更好的写法。
我的第二个困难是,我想写成类似 R 中 *apply 系列的 FUN 的风格,
但我不甚了解怎么撰写这类风格的 function。
我猜是建出一个 list 再用 lapply 来延伸,不知道好不好?
举一个例好了
x <- 1:5
newFun(x, n, FUN) <- function{...}
newFun(x, 0, sum) #回传 1, 2, 3, 4, 5
newFun(x, 1, sum) #回传 3, 6, 9, 12, 9
# =1+2 =1+2+3 =2+3+4 =3+4+5 =4+5
newFun(x, 2, sum) #回传 6, 10, 15, 14, 12
newFun(x, 0, function(a){a+1}) #回传 2,3,4,5,6
如果有什么想法,欢迎请提供线索给我即可,不用全刻出来没关系。
作者: celestialgod (天)   2015-07-24 01:50:00
我给一个想法 明天再写 头尾先独立, 所以剩下只是组合问题,像是五个元素,n=1的话,中间三个考虑的是(111), (0), (0)这三个的组合,最后头尾只要用head(, n)还有tail(, n)做新向量插入就好n=2的话 就要头尾两个独立,然后算中间那个所以要做组合的元素个数是length(v)-n*2头尾个数都是n头尾都要做到2*n-1个更正头尾是从 n到2*n-1
楼主: andrew43 (讨厌有好心推文后删文者)   2015-07-24 01:56:00
你几乎把过程都写出来了,谢谢。
作者: celestialgod (天)   2015-07-24 01:59:00
我会考虑location matrix(logical) 列数行数都是输入向量的长度,默认是FALSE,用循环做head, tail做n个从n到n-1,中间用combinations把,只是要注意combinations的顺序,要运算的值改为TRUE,再用apply做就好更正应该是从n到2*n-1
楼主: andrew43 (讨厌有好心推文后删文者)   2015-07-24 02:12:00
c兄,多谢。延着你的提示,我突然想到另x<-c(NA,x,NA)之类的办法就可以解决不少问题。不过这还是有很多限制,例如FUN本身要能处理NA。但对于FUN=sum|mean之类的,这样就已经足够了。例如FUN=sum的情况,头和尾直接填0就可,连NA处理都免了
作者: celestialgod (天)   2015-07-24 02:18:00
这是一个方法只是其他计算可能没用
楼主: andrew43 (讨厌有好心推文后删文者)   2015-07-24 02:23:00
是的。要一般化的话不能这么做。
作者: Edster (Edster)   2015-07-24 08:20:00
第一个想到的是moving average, 例如hydroTSM::ma不过若还要换成别的Function. 应该改成去尾补NA即可.原来已经讨论过了. 0跟NA不同. 真的建议不要补0
楼主: andrew43 (讨厌有好心推文后删文者)   2015-07-24 19:16:00
celestialgod提到,package zoo里有 roll*() 一系列的function,完全是我需要的没错。参考看看。
作者: Wush978 (拒看低质媒体)   2015-07-25 00:54:00
有考虑使用filter这个内建函数吗?
楼主: andrew43 (讨厌有好心推文后删文者)   2015-07-25 12:14:00
w兄,我没搞懂你的意思。

Links booklink

Contact Us: admin [ a t ] ucptt.com