将列与行匹配并从列中减去

Match Columns with rows and subtract from columns

我的数据如下:

     >dput(mea)
     >structure(list(mea = c(NA, NA, NA, NA, 7.5, 19.5)), .Names = "mea",
     row.names = c(NA,-6L), class = "data.frame")

     >dput(m1)
     >structure(list(t = c(5e-04, 0.001, 0.0015, 0.002, 0.0025, 0.003, 
     0.0035, 0.004, 0.0045, 0.005, 0.0055, 0.006, 0.0065, 0.007, 0.0075, 
     0.008, 0.0085, 0.009, 0.0095, 0.01, 0.0105, 0.011, 0.0115, 0.012, 
     0.0125, 0.013, 0.0135, 0.014, 0.0145, 0.015), a = c(21L, 13L, 
     17L, 20L, 19L, 9L, 11L, 16L, 28L, 10L, 14L, 12L, 15L, 27L, 30L, 
     6L, 29L, 22L, 24L, 5L, 25L, 18L, 26L, 1L, 3L, 4L, 23L, 8L, 7L, 
     2L), b = c(1, 1, 1, 1, 1, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 
     1, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1), c = c(19L, 25L, 14L, 
     18L, 3L, 4L, 5L, 6L, 8L, 20L, 17L, 13L, 28L, 2L, 29L, 15L, 26L, 
     12L, 24L, 16L, 9L, 1L, 22L, 27L, 21L, 23L, 11L, 10L, 7L, 30L), 
     `4` = c(NA, NA, NA, 18L, 3L, 4L, 5L, 6L, 8L, 20L, 17L, 13L, 
     NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
     NA, NA, NA), `17` = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 
     NA, NA, NA, NA, NA, NA, NA, 26L, 12L, 24L, 16L, 9L, 1L, 22L, 
     27L, 21L, NA, NA, NA, NA, NA), `<NA>` = c(NA_integer_, NA_integer_, 
     NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
     NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
     NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
     NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
     NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
     NA_integer_, NA_integer_, NA_integer_)), class = "data.frame",
     row.names = c(NA,30L), .Names = c("t", "a", "b", "c", "4", "17", "<NA>"))

我要做的是将 mea 的行名与 m1 的列名相匹配,然后从 mea 的整列中减去 mea 的适当值=14=](匹配 mea 的行名)。

我做的是:

    mea1<-na.omit(mea)
    idx <- match(rownames(mea1) , 1:ncol(m1)) 
    m5 <- cbind((m1[,idx] - mea[idx,]), m1[,-idx])

我从这里问的问题中得到这个:

它确实有效,但方法不对。它从 m1 的第一个匹配列中减去 mea 的第二个(最后一个值),从 m1 的第二个匹配列中减去 mea 的第一个值。但它应该是正确的顺序。 我在某处读到 cbind 从头到尾工作,是这里的问题吗?我该如何解决?

提前致谢!

此致, 克里斯

问题是您正试图从 data.frame 中减去一个向量,因此向量元素正在被回收。它实际上并没有减去 "wrong" 方向的元素(即从第 1 列减去 19.5,从第 2 列减去 7.5)。相反,正在发生的事情是 19.57.5 以交替顺序从每一列中减去(因为正在回收元素以适应列的长度。

例如,查看 head((m1[,idx] - mea[idx,]))head(m1[,idx]) 的比较。您会看到第 4 行是 -1.518 - 19.5,第 5 行是 -4.53 - 7.5

要解决此问题,您可以改用 mapply

m5 <- cbind(mapply("-", m1[,idx], mea[idx,]), m1[,-idx])

现在,如果我们查看 head(m5[,c(1,2)]),我们会看到:

    4 17
1   NA NA
2   NA NA
3   NA NA
4 10.5 NA
5 -4.5 NA
6 -3.5 NA

或者 7.5 被正确地从整个第一列中减去。如果检查第二列,您还可以看到 19.5 已从整个列

中正确减去