R如何取数据帧中最后n个非零项的中值

R如何取数据帧中最后n个非零项的中值,r,vector,median,R,Vector,Median,如果我有这样一个数据帧: df1 vec1 vec2 vec3 0 1 5 1 4 3 2 3 7 0 0 0 0 5 0 我希望它是这样的: df1 vec1 vec2 vec3 vec1median vec2median vec3median 0 1 10 2.75 4 9 1 4 3 2.75

如果我有这样一个数据帧:

df1
vec1  vec2 vec3 
0     1    5    
1     4    3    
2     3    7    
0     0    0    
0     5    0    
我希望它是这样的:

df1
vec1  vec2 vec3 vec1median vec2median vec3median
0     1    10   2.75       4          9 
1     4    3    2.75       4.25       7
2     3    7    4          5          9
0     0    0    4          5          9   
4     5    9    4          5          9
4     5    9    ..         ..         ..
式中,vecnmedia是在滚动基础上应用的vecN的中值,向上移动到各自的n1、2和3

棘手的部分是:我希望能够在忽略零的情况下取中值,如示例中所示。最重要的是,我想指定中值函数的应用距离。我想指定滚动中值是应用于df1$vec1[x:x+100]还是100以外的任何值。如果使用for循环,我可以。另外,我还希望能够将滚动中值应用于vec1的最后n个非零实例


谢谢

这个问题的有效答案似乎很棘手,尽管我确信有些软件包可以做到这一点。我能想到的最简单但效率低下的方法是基于以下几点:

vec1 <- c(1,2,0,0,3,4,1)
sapply(1:length(vec1), function(d) { median (vec1[d:length(vec1)]) })

我想我对这个问题的理解是正确的。将数据帧和起始索引中的向量传递到此函数中,以获得滚动中间值的向量

 RollMedNoZeros <- function(x, StartRow) {
     sapply(StartRow:length(x) - 1, function(a) { median(x[-union(which(x == 0), match(x[1:a], x))]) })
 }

 vec <- c(0, 1, 0, 2, 0, 3)
 RollMedNoZeros(vec, 1)
 [1] 2.0 2.0 2.5 2.5 3.0 3.0

 RollMedNoZeros(vec, 2)
 [1] 2.0 2.5 2.5 3.0 3.0

 RollMedNoZeros(vec, 3)
 [1] 2.5 2.5 3.0 3.0

 vec2 <- c(0, 1, 0, 2, 0, 3, 0, 0)
 RollMedNoZeros(vec2, 1)
 [1] 2.0 2.0 2.5 2.5 3.0 3.0  NA  NA

你是说中位数而不是中位数?只看vec1,那里的值对应于平均值,而不是中间值。将问题简化为单个向量的计算,然后考虑推广,这可能是有用的。我给出了3个向量作为示例,以防1个向量不够清晰。如果答案只适用于1个向量,那就好了。如果你仔细观察vec1median,你会发现它确实是vec1的中值。medianc1,2,4,4是3,而不是2.75-对于偶数,中值是中间两个元素的平均值,因此对于整数列表,小数部分永远不会不等于0或.5。我只是想澄清一下,问题是问它的主体在说什么。是的,你是对的,值应该是中间两个的平均值,而不是整个指数。我的错误。假设这只是一个数据错误,我认为理想的方法是将0替换为NAs,然后使用中间值中的na.rm参数将其过滤掉-听起来这就是如何有效地处理它们,因此,从数据清洁度的角度来看,这可能也很好。当我将d:lengthvec1更改为所需的回顾期时,第一个示例似乎对第一个目标很有效。这对实现我的第一个目标正确吗?你能描述一下第二个代码rollup.median的效果吗?我在问题的末尾添加了一个使用rollup.median的示例;希望它能澄清。说得清楚一点,这实现了返回N行数,而不是N个非零实例的目标,对吗?我认为在匿名函数中添加一个[whicha!=0]会起作用,但我在车里,现在无法测试。我想你需要在函数中定义“a”。也许你指的是功能,斯塔特罗?对不起。草率的错误。我做了一些修正。
> sapply(df1, function(d) { rollup.median(d, 1, 5)})
     vec1 vec2 vec3
[1,]  1.5  3.5    5
[2,]  1.5  4.0    5
[3,]  2.0  4.0    7
[4,]   NA  5.0   NA
[5,]   NA  5.0   NA
 RollMedNoZeros <- function(x, StartRow) {
     sapply(StartRow:length(x) - 1, function(a) { median(x[-union(which(x == 0), match(x[1:a], x))]) })
 }

 vec <- c(0, 1, 0, 2, 0, 3)
 RollMedNoZeros(vec, 1)
 [1] 2.0 2.0 2.5 2.5 3.0 3.0

 RollMedNoZeros(vec, 2)
 [1] 2.0 2.5 2.5 3.0 3.0

 RollMedNoZeros(vec, 3)
 [1] 2.5 2.5 3.0 3.0

 vec2 <- c(0, 1, 0, 2, 0, 3, 0, 0)
 RollMedNoZeros(vec2, 1)
 [1] 2.0 2.0 2.5 2.5 3.0 3.0  NA  NA