首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相对于所有其他观测,每次观测的顺序减法

相对于所有其他观测,每次观测的顺序减法
EN

Stack Overflow用户
提问于 2017-05-17 21:53:06
回答 3查看 294关注 0票数 1

下面是这个问题的一些示例数据,让我们调用这个示例dataset df:

代码语言:javascript
复制
     df$x  

   obs  x   
    1   2  
    2   4   
    3   8   
    4   16   

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

数学应该是这样的:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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基础上做到这一点,这样我就能更好地掌握它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-17 22:06:48

你可以用sapply来做

代码语言:javascript
复制
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)))

这将返回:

代码语言:javascript
复制
obs col1 col2 col3
1   1   -2   -6  -14
2   2    2   -4  -12
3   3    6    4   -8
4   4   14   12    8
票数 3
EN

Stack Overflow用户

发布于 2017-05-17 22:20:16

另一种选择是使用expand.grid

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2017-05-18 03:43:15

下面是另一种使用来自CJdata.table的选项

代码语言:javascript
复制
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

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44035359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档