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

时间:2017-11-30 15:18:38

标签: r cbind

我的数据如下:

     >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的rownames与m1的列名相匹配,然后从{{1}的整列中减去mea的相应值}(与m1的rowname相匹配)。

我做的是:

mea

我从这里提出的问题得到了这个: https://stackoverflow.com/a/18077661/5681674

它可以解决问题,但方法错误。它从 mea1<-na.omit(mea) idx <- match(rownames(mea1) , 1:ncol(m1)) m5 <- cbind((m1[,idx] - mea[idx,]), m1[,-idx]) 的第一个匹配列中减去mea的第二个(最后一个值),从m1的第二个匹配列中减去mea的第一个值。但它应该是正确的顺序。 我读到m1从头到尾工作的地方,问题就在这里吗?我该如何解决?

提前谢谢!

祝你好运, 克里斯

1 个答案:

答案 0 :(得分:1)

问题是你试图从data.frame中减去一个向量,以便向量元素被回收。它实际上并没有减去&#34;错误&#34;中的元素。方向(即第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