在r中与diff相反的cumsum

时间:2015-08-14 12:01:28

标签: r

我有一个问题,我不确定我是在这里完全愚蠢,还是这是一个真正的问题,或者我是否误解了这些功能的作用。

diff的反面与cumsum相同吗?我以为是的。但是,使用此示例:

$sql_condition = '( 1=2 '; // one fake-condition, just to make it possible to start with 'OR' later

foreach($option[0] as $key => $value) {  // iterate through all possible conditions
    if($value===1) { // maybe exclude $keys that should not be used here
        $sql_condition.=' OR post_type="'.$key.'"';
    }
}
$sql_condition.=')';

$results = $wpdb->get_results( 'SELECT * FROM '.$wpdb->prefix.'posts WHERE post_status="publish" AND '.$sql_condition.' ORDER BY post_title ASC', OBJECT );

这些不一样。我哪里出错?

AHHH!星期五。

显然

4 个答案:

答案 0 :(得分:4)

功能完全不同:diff(x)返回长度为(length(x)-1)的向量,其中包含向量x中一个元素与下一个元素之间的差异,而cumsum(x)返回一个长度等于x长度的向量,其中包含x

中元素的总和

示例:

x <- c(1:10)
#[1]  1  2  3  4  5  6  7  8  9 10
> diff(x)
#[1] 1 1 1 1 1 1 1 1 1
v <- cumsum(x)
> v
#[1]  1  3  6 10 15 21 28 36 45 55

函数cumsum()是累积总和,因此它返回的向量v[i]的条目是x与{x[1]之间的所有元素的结果1}}。相比之下,x[i]仅取一个元素diff(x)与下一个x[i]之间的差异。

x[i+1]cumsum的组合导致不同的结果,具体取决于执行函数的顺序:

diff

这里的结果是九个“1”序列的累积和。请注意,如果将此结果与原始向量> cumsum(diff(x)) # 1 2 3 4 5 6 7 8 9 进行比较,则会丢失最后一个条目x

另一方面,通过计算

10

获得一个与原始向量> diff(cumsum(x)) # 2 3 4 5 6 7 8 9 10 类似的向量,但现在缺少第一个条目x

在任何情况下都不恢复原始向量,因此不能说明1cumsum()

的相反或反函数

答案 1 :(得分:3)

你忘了考虑第一个元素的影响

dd == c(dd [[1]],dd [[1]] + cumsum(diff(dd)))

答案 2 :(得分:1)

@RHertel回答得很好,说明diff()会返回length(x)-1的向量。

因此,另一个简单的解决方法是将0添加到原始向量的开头,以便diff()计算x[1]0之间的差异。

> x <- 5:10

> x
#[1]  5  6  7  8  9 10

> diff(x)
#[1] 1 1 1 1 1

> diff(c(0,x))
#[1] 5 1 1 1 1 1

这样可以将diff()c()一起用作cumsum()

的倒数的表示
> cumsum(diff(c(0,x)))
#[1]  1  2  3  4  5  6  7  8  9 10

> diff(c(0,cumsum(x)))
#[1]  1  2  3  4  5  6  7  8  9 10

答案 3 :(得分:0)

如果您知道“滞后”和“差异”的值。

x<-5:10
y<-diff(x,lag=1,difference=1)    
z<-diffinv(y,lag=1,differences = 1,xi=5) #xi is first value.
k<-as.data.frame(cbind(x,z))
k
   x  z
1  5  5
2  6  6
3  7  7
4  8  8
5  9  9
6 10 10