R: for-loop over matrix returns 只有最后一个值
R: for-loop over matrix returns only last values
所以我有一个充满随机数的矩阵:mat_base = matrix(sample(1:20, 100, replace = TRUE), nrow=10, ncol=10)
和另一个矩阵 mat_table = matrix(,100,3)
,它的列名是:colnames(mat_table) <- c("row", "col", "value")
.
我想将所有值及其位置(行号和列号)从 mat_base
放置到 mat_table
并且我已经成功地使用了这些位置。但是对于每个单元格的值 mat_table
只有 returns 来自 mat_base
.
最后一列的值
这是我目前的代码:
for (j in 1:nrow(mat_base)) {
for (k in 1:ncol(mat_base)){
#2 nested for-loops to go through mat_base
mat_table[,1] <- row(mat_base)
#the function "row" returns a matrix of row numbers
#put row numbers in the first column of mat_table
mat_table[,2] <- col(mat_base)
#the function "col" returns a matrix of column numbers
#put column numbers in the second column of mat_table
mat_table[,3] <- mat_base[,k]
#get current value of mat_base and put it into mat_table
#put values in the third column of mat_table
}
}
mat_table
#show mat_table in the console
我知道我可能不需要带有 j
的外部 for 循环,因为没有它结果是一样的(反正我没有使用 j
)但我不确定所以我暂时把它留了下来。
这是我使用这段代码得到的结果:
> mat_table
row col value
[1,] 1 1 4
[2,] 2 1 11
[3,] 3 1 13
[4,] 4 1 13
[5,] 5 1 2
[6,] 6 1 17
[7,] 7 1 7
[8,] 8 1 14
[9,] 9 1 19
[10,] 10 1 3
[11,] 1 2 4
[12,] 2 2 11
[13,] 3 2 13
[14,] 4 2 13
[15,] 5 2 2
[16,] 6 2 17
[17,] 7 2 7
[18,] 8 2 14
[19,] 9 2 19
[20,] 10 2 3
[21,] 1 3 4
[22,] 2 3 11
[23,] 3 3 13
...
正如您在 mat_table
的第三列中看到的,只有 mat_base
的最后一列被一遍又一遍地重复。如何将 mat_base
中的所有值转换为 mat_table
?
Edit/Answer:
好吧,我发现通过使用循环,我的生活变得比原来更艰难了......
最后我是这样解决这个问题的:
mat_base = matrix(sample(1:20, 100, replace = TRUE), nrow=10, ncol=10)
#my data
mat_table = matrix(,100,3)
#create an empty matrix with 100 rows and 3 columns
colnames(mat_table) <- c("row", "col", "value")
#change the column names
mat_table <- cbind(c(row(mat_base)), c(col(mat_base)), c(mat_base))
#put row numbers, column numbers and values from mat_base into mat_table
mat_table
#show mat_table in console
编辑 2:
但是如果你想按照我最初尝试的方式去做,请查看@Mohanasundaram 的答案!
获得所需 table 的另一种方法是这样。
mat_base = matrix(sample(1:20, 100, replace = TRUE), nrow=10, ncol=10)
mat_table <- data.frame(row = rep(1:nrow(mat_base), by = ncol(mat_base)),
col = rep(1:ncol(mat_base), each = nrow(mat_base)),
value = c(mat_base))
对于您的原始方法,这是解决方案。您必须按行名和列名过滤矩阵,然后分配值。但是,这不是一个有效的方法。
mat_base = matrix(sample(1:20, 100, replace = TRUE), nrow=10, ncol=10)
mat_table = matrix(,100,3)
colnames(mat_table) <- c("row", "col", "value")
for (j in 1:nrow(mat_base)) {
for (k in 1:ncol(mat_base)){
#2 nested for-loops to go through mat_base
mat_table[,1] <- row(mat_base)
#the function "row" returns a matrix of row numbers
#put row numbers in the first column of mat_table
mat_table[,2] <- col(mat_base)
#the function "col" returns a matrix of column numbers
#put column numbers in the second column of mat_table
mat_table[mat_table[,"row"] == j & mat_table[,"col"] == k,3] <- mat_base[j,k]
#get current value of mat_base and put it into mat_table
#put values in the third column of mat_table
}
}
所以我有一个充满随机数的矩阵:mat_base = matrix(sample(1:20, 100, replace = TRUE), nrow=10, ncol=10)
和另一个矩阵 mat_table = matrix(,100,3)
,它的列名是:colnames(mat_table) <- c("row", "col", "value")
.
我想将所有值及其位置(行号和列号)从 mat_base
放置到 mat_table
并且我已经成功地使用了这些位置。但是对于每个单元格的值 mat_table
只有 returns 来自 mat_base
.
这是我目前的代码:
for (j in 1:nrow(mat_base)) {
for (k in 1:ncol(mat_base)){
#2 nested for-loops to go through mat_base
mat_table[,1] <- row(mat_base)
#the function "row" returns a matrix of row numbers
#put row numbers in the first column of mat_table
mat_table[,2] <- col(mat_base)
#the function "col" returns a matrix of column numbers
#put column numbers in the second column of mat_table
mat_table[,3] <- mat_base[,k]
#get current value of mat_base and put it into mat_table
#put values in the third column of mat_table
}
}
mat_table
#show mat_table in the console
我知道我可能不需要带有 j
的外部 for 循环,因为没有它结果是一样的(反正我没有使用 j
)但我不确定所以我暂时把它留了下来。
这是我使用这段代码得到的结果:
> mat_table
row col value
[1,] 1 1 4
[2,] 2 1 11
[3,] 3 1 13
[4,] 4 1 13
[5,] 5 1 2
[6,] 6 1 17
[7,] 7 1 7
[8,] 8 1 14
[9,] 9 1 19
[10,] 10 1 3
[11,] 1 2 4
[12,] 2 2 11
[13,] 3 2 13
[14,] 4 2 13
[15,] 5 2 2
[16,] 6 2 17
[17,] 7 2 7
[18,] 8 2 14
[19,] 9 2 19
[20,] 10 2 3
[21,] 1 3 4
[22,] 2 3 11
[23,] 3 3 13
...
正如您在 mat_table
的第三列中看到的,只有 mat_base
的最后一列被一遍又一遍地重复。如何将 mat_base
中的所有值转换为 mat_table
?
Edit/Answer: 好吧,我发现通过使用循环,我的生活变得比原来更艰难了...... 最后我是这样解决这个问题的:
mat_base = matrix(sample(1:20, 100, replace = TRUE), nrow=10, ncol=10)
#my data
mat_table = matrix(,100,3)
#create an empty matrix with 100 rows and 3 columns
colnames(mat_table) <- c("row", "col", "value")
#change the column names
mat_table <- cbind(c(row(mat_base)), c(col(mat_base)), c(mat_base))
#put row numbers, column numbers and values from mat_base into mat_table
mat_table
#show mat_table in console
编辑 2: 但是如果你想按照我最初尝试的方式去做,请查看@Mohanasundaram 的答案!
获得所需 table 的另一种方法是这样。
mat_base = matrix(sample(1:20, 100, replace = TRUE), nrow=10, ncol=10)
mat_table <- data.frame(row = rep(1:nrow(mat_base), by = ncol(mat_base)),
col = rep(1:ncol(mat_base), each = nrow(mat_base)),
value = c(mat_base))
对于您的原始方法,这是解决方案。您必须按行名和列名过滤矩阵,然后分配值。但是,这不是一个有效的方法。
mat_base = matrix(sample(1:20, 100, replace = TRUE), nrow=10, ncol=10)
mat_table = matrix(,100,3)
colnames(mat_table) <- c("row", "col", "value")
for (j in 1:nrow(mat_base)) {
for (k in 1:ncol(mat_base)){
#2 nested for-loops to go through mat_base
mat_table[,1] <- row(mat_base)
#the function "row" returns a matrix of row numbers
#put row numbers in the first column of mat_table
mat_table[,2] <- col(mat_base)
#the function "col" returns a matrix of column numbers
#put column numbers in the second column of mat_table
mat_table[mat_table[,"row"] == j & mat_table[,"col"] == k,3] <- mat_base[j,k]
#get current value of mat_base and put it into mat_table
#put values in the third column of mat_table
}
}