将列与行匹配并从列中减去
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.5
和 7.5
以交替顺序从每一列中减去(因为正在回收元素以适应列的长度。
例如,查看 head((m1[,idx] - mea[idx,]))
与 head(m1[,idx])
的比较。您会看到第 4 行是 -1.5
或 18 - 19.5
,第 5 行是 -4.5
或 3 - 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
已从整个列
中正确减去
我的数据如下:
>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.5
和 7.5
以交替顺序从每一列中减去(因为正在回收元素以适应列的长度。
例如,查看 head((m1[,idx] - mea[idx,]))
与 head(m1[,idx])
的比较。您会看到第 4 行是 -1.5
或 18 - 19.5
,第 5 行是 -4.5
或 3 - 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
已从整个列