减去两列以在R中提供新列

时间:2014-05-27 11:18:38

标签: r syntax

您好我试图从B矩阵中的列A中减去列dat以创建C列(A - {{ 1}}):

我的意见:

B

我的预期输出:

A  B
1  2
2  2
3  2
4  2

我尝试过:A B C 1 2 -1 2 2 0 3 2 1 4 2 2 ,但收到了dat$C <- (dat$A - dat$B)错误

干杯。

3 个答案:

答案 0 :(得分:15)

正如@Bryan Hanson在上述评论中所说,您的语法和数据组织更多地与数据框相关。我会将您的数据视为数据框,只需使用您之前提供的语法:

> data <- data.frame(A = c(1,2,3,4), B = c(2,2,2,2))
> data$C <- (data$A - data$B)
> data
  A B  C
1 1 2 -1
2 2 2  0
3 3 2  1
4 4 2  2

答案 1 :(得分:3)

是的,如果你真的是指一个矩阵,你可以看到这个例子

> x <- matrix(data=1:3,nrow=4,ncol=3)
> x
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    3    1
[3,]    3    1    2
[4,]    1    2    3
> x[,3] = x[,1]-x[,2]
> x
     [,1] [,2] [,3]
[1,]    1    2   -1
[2,]    2    3   -1
[3,]    3    1    2
[4,]    1    2   -1
> 

答案 2 :(得分:0)

但是,这里绝对应该指出,R中的矩阵运算不遵守通常的线性代数闭包。

> x[,3]-x[,1]
[1]  2 -1 -1  2
> is.matrix(x[,3]-x[,1])
[1] FALSE

此外,还可以直接预期一个列向量,该列向量可以通过应用矩阵转置TWICE(本身是怪异的)获得,而第一个向量将输出转换为矩阵。

> t(t(x[,3]-x[,1]))
     [,1]
[1,]    2
[2,]   -1
[3,]   -1
[4,]    2

或者可以使用drop = FALSE选项:

>x[,3,drop=FALSE] - x[,1,drop=FALSE]
     [,1]
[1,]    2
[2,]   -1
[3,]   -1
[4,]    2

虽然3D数组中2D切片的行为很好。