针对所有其他观察结果的每次观察的连续减法

时间:2017-05-17 21:53:06

标签: r loops iteration sequence

以下是此问题的一些示例数据,我们将此示例称为数据集df:

     df$x  

   obs  x   
    1   2  
    2   4   
    3   8   
    4   16   

我想要完成的是找到每个x与所有x的所有其他x的差异,并将这些差异存储在对象中。

这是数学应该是什么样的:

some code later:
result_df

       obs  col1 col2 col3   
        1   2-4  2-8  2-16
        2   4-2  4-8  4-16
        3   8-2  8-4  8-16   
        4   16-2 16-4 16-8

到目前为止我尝试过的是这样的事情:

for (i in 1:nrow(df)){
#Create empty matrix
mat<-matrix(rep(0,(nrow(df))*(nrow(df)-1)),ncol=nrow(df)-1,nrow=nrow(df))
#occupy matrix with desired results
mat[i,]<-df$x[i]-df$x[i+1]
print(mat)
}

我希望这段代码对我示例中的result_df的第一行有效(我想我必须为每个给定的x创建另一个循环来执行此操作?),但它没有给出我想要的结果

我希望这很清楚。谢谢!能够在基地R中做到这一点真是太棒了,所以我能更好地掌握它。

3 个答案:

答案 0 :(得分:3)

您可以使用sapply执行此操作:

d=t(sapply(1:nrow(df),function(i) df$x[i]-df$x[-i]))
res_df=data.frame(df$obs,d)
names(res_df)=c("obs",paste0("col",c(1:3)))

返回:

obs col1 col2 col3
1   1   -2   -6  -14
2   2    2   -4  -12
3   3    6    4   -8
4   4   14   12    8

答案 1 :(得分:0)

另一种选择是使用expand.grid

expanded <- expand.grid(df$x, df$x)
subtr <- expanded[!(expanded$Var1 == expanded$Var2), "Var2"] - expanded[!(expanded$Var1 == expanded$Var2), "Var1"]
data.frame(matrix(subtr, nrow = nrow(df), byrow = T))

#  X1 X2  X3
#1 -2 -6 -14
#2  2 -4 -12
#3  6  4  -8
#4 14 12   8

答案 2 :(得分:0)

以下是使用CJ

中的data.table的另一个选项
library(data.table)
matrix(CJ(df$x, df$x)[V1 != V2, V1-V2], nrow(df), byrow=TRUE)
#     [,1] [,2] [,3]
#[1,]   -2   -6  -14
#[2,]    2   -4  -12
#[3,]    6    4   -8
#[4,]   14   12    8

base R选项为outer

m1 <- outer(df$x, df$x, `-`)
cbind(obs = 1:4, matrix(m1[m1!=0], nrow= nrow(df), byrow = TRUE,
            dimnames = list(NULL, paste0('col', 1:3))))
#     obs col1 col2 col3
#[1,]   1    2    6   14
#[2,]   2   -2    4   12
#[3,]   3   -6   -4    8
#[4,]   4  -14  -12   -8

可以通过data.frame

换行将其转换为as.data.frame