将一个矩阵的几列与R

时间:2018-10-31 03:50:29

标签: r matrix

这里我创建了一个重复的数据集。

set.seed(1234)
m1 = matrix(runif(2000), nrow = 10, ncol = 200)
dim(m1)
[1]  10 200
m2 = matrix(runif(100), nrow = 10, ncol = 10)
dim(m2)
[1] 10 10

我想将1:20的前m1列与1st column矩阵的m2进行比较。类似地,对于21:40的下一个m1列与2nd column矩阵的m2,依此类推。最后,将矩阵181:200的{​​{1}}列与矩阵m1的{​​{1}}列相对。

我编写了以下代码,将10th矩阵的m2 1st列与20矩阵的m1列进行比较。

1st

如何改善以上m2进行上述比较。有cc = matrix(NA, nrow(m2), ncol(m2)) for (j in 1:ncol(m2)) { for (i in 1:nrow(m2)) { cc[i, j] = ifelse(m1[i, j] < m2[i,1], 1, 0) } } ccvalue = data.frame(cc) 个函数可以做吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以利用R中的隐式矢量化对m2的列运行整个m1矩阵。您只需通过一次又一次为同一列设置子集来使m2重复列。例如,v <-c("A","B","C")可以执行等于v[c(1,1,2,2,3,3)]的{​​{1}}。

测试以下代码,如果您有任何疑问,请通知我:

"A","A","B","B","C","C"

正在回答的评论:

# we want to compare m1[,c(1,2,3,...)], with m2[,c(1,1,1,...)]
# summing 1,0,...,1,0,... to get 1,1,...,2,2,...
m2_to_compare <- cumsum(rep(c(1,rep(0,19)),10)) 
# length should match m1 columns
length(m2_to_compare) 
(m1 < m2[,m2_to_compare]) * 1 # turns TRUEs and FALSEs into 1s and 0s

答案 1 :(得分:1)

需要指出的几点:

(1)最好为矩阵m2设置种子。也许您忽略了这一点。

(2)在提供的代码中,您似乎仅将m210的前m1列进行比较。

如果您只想比较10列,则可以这样做:

cc <- (m2 > m1[, c(1:10)])*1