【问题标题】:Subtracting two columns to give a new column in R减去两列以在 R 中给出一个新列
【发布时间】:2014-07-16 06:49:57
【问题描述】:

您好,我正在尝试从dat 矩阵中的A 列中减去B 列以创建C 列(A - 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),但我得到了:## $ operator is invalid for atomic vectorserror

干杯。

【问题讨论】:

  • 如果你的意思是一个矩阵,你需要input[,"B"] - input[,"A"] 或者可能使用直接索引:input[,2] - input[,1] 如果 A 和 B 是前两列。您使用的语法是data frames。如果不确定,可以str(input) 看看是什么。
  • @BryanHanson 我很抱歉在您发表此评论时提供了答案,我只是没有看到它。
  • 不用担心。看起来他们有答案了。

标签: r syntax


【解决方案1】:

但是,在这里绝对应该指出,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 切片的行为很好。

【讨论】:

    【解决方案2】:

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

    > 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
    > 
    

    【讨论】:

      【解决方案3】:

      正如@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
      

      【讨论】:

      • 将数据转换为数据框后出现此错误:## - makes no sense to factors 对问题来源的一些想法?
      • 您应该发布dput(head(str(your_data))),以便我们可以看到您正在使用什么,否则我们必须猜测哪个不是很好地利用时间。将其添加到您的原始帖子中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多