以下是此问题的一些示例数据,我们将此示例称为数据集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中做到这一点真是太棒了,所以我能更好地掌握它。
答案 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