使用which()处理矩阵数据,return所有行名
Processing the matrix data by using which(), and return all the row names
我想使用 which()
和 return 所有行名称来处理以下矩阵数据,例如:
m = matrix(seq(-1,1, 0.5), nrow = 3)
# [,1] [,2]
#[1,] -1.0 0.5
#[2,] -0.5 1.0
#[3,] 0.0 -1.0
which(m==0.5,arr.ind=TRUE)
# row col
# [1,] 1 2
我怎样才能得到这样的矩阵? table中可以显示所有行名,col
中缺失值为NA。
# row col
# [1,] 1 2
# [2,] 2 NA
# [3,] 3 NA
# [4,] 4 NA
这里有一个方法,先把矩阵变成dataframe,然后用tidyr::complete()
根据m
的行数“扩充”dataframe。最后改回矩阵。
library(tidyverse)
as.data.frame(which(m==0.5,arr.ind=TRUE)) %>%
complete(row = 1:nrow(m)) %>%
as.matrix()
row col
[1,] 1 2
[2,] 2 NA
[3,] 3 NA
仅使用 base R
,您就可以构建一个函数。请在下面找到一个代表:
Reprex
- 您的数据
m = matrix(seq(-1,1, 0.5), nrow = 3)
- 函数代码
indexfunct <- function(x, value){
res <- matrix(NA, nrow = dim(x)[1], ncol = dim(x)[2], dimnames = (list(seq(dim(x)[1]), c("row", "col"))))
res[,1] <- seq(dim(x)[1])
res[which(x==value,arr.ind=TRUE)[,1],2] <- which(x==value,arr.ind=TRUE)[,2]
return(res)
}
- 函数的输出
indexfunct(m, value = 0.5)
#> row col
#> 1 1 2
#> 2 2 NA
#> 3 3 NA
由 reprex package (v2.0.1)
创建于 2022-03-06
另一种可能的基础 R 解决方案:
m = matrix(seq(-1,1, 0.5), nrow = 3)
rbind(which(m == 0.5, arr.ind = TRUE),
cbind(setdiff(1:nrow(m), which(m == 0.5, arr.ind = TRUE)[,"row"]), NA))
#> row col
#> [1,] 1 2
#> [2,] 2 NA
#> [3,] 3 NA
如果需要一个功能:
getindexes <- function(mat, value)
{
rbind(which(mat == value, arr.ind = TRUE),
cbind(setdiff(1:nrow(mat), which(mat == value,arr.ind = TRUE)[,"row"]), NA))
}
getindexes(m, 0.5)
#> row col
#> [1,] 1 2
#> [2,] 2 NA
#> [3,] 3 NA
我们确实可以在没有 which
的情况下尝试这个基本的 R 选项
> v <- rowSums(col(m) * (m == 0.5))
> cbind(row = 1:nrow(m), col = v * NA^(!v))
row col
[1,] 1 2
[2,] 2 NA
[3,] 3 NA
我想使用 which()
和 return 所有行名称来处理以下矩阵数据,例如:
m = matrix(seq(-1,1, 0.5), nrow = 3)
# [,1] [,2]
#[1,] -1.0 0.5
#[2,] -0.5 1.0
#[3,] 0.0 -1.0
which(m==0.5,arr.ind=TRUE)
# row col
# [1,] 1 2
我怎样才能得到这样的矩阵? table中可以显示所有行名,col
中缺失值为NA。
# row col
# [1,] 1 2
# [2,] 2 NA
# [3,] 3 NA
# [4,] 4 NA
这里有一个方法,先把矩阵变成dataframe,然后用tidyr::complete()
根据m
的行数“扩充”dataframe。最后改回矩阵。
library(tidyverse)
as.data.frame(which(m==0.5,arr.ind=TRUE)) %>%
complete(row = 1:nrow(m)) %>%
as.matrix()
row col
[1,] 1 2
[2,] 2 NA
[3,] 3 NA
仅使用 base R
,您就可以构建一个函数。请在下面找到一个代表:
Reprex
- 您的数据
m = matrix(seq(-1,1, 0.5), nrow = 3)
- 函数代码
indexfunct <- function(x, value){
res <- matrix(NA, nrow = dim(x)[1], ncol = dim(x)[2], dimnames = (list(seq(dim(x)[1]), c("row", "col"))))
res[,1] <- seq(dim(x)[1])
res[which(x==value,arr.ind=TRUE)[,1],2] <- which(x==value,arr.ind=TRUE)[,2]
return(res)
}
- 函数的输出
indexfunct(m, value = 0.5)
#> row col
#> 1 1 2
#> 2 2 NA
#> 3 3 NA
由 reprex package (v2.0.1)
创建于 2022-03-06另一种可能的基础 R 解决方案:
m = matrix(seq(-1,1, 0.5), nrow = 3)
rbind(which(m == 0.5, arr.ind = TRUE),
cbind(setdiff(1:nrow(m), which(m == 0.5, arr.ind = TRUE)[,"row"]), NA))
#> row col
#> [1,] 1 2
#> [2,] 2 NA
#> [3,] 3 NA
如果需要一个功能:
getindexes <- function(mat, value)
{
rbind(which(mat == value, arr.ind = TRUE),
cbind(setdiff(1:nrow(mat), which(mat == value,arr.ind = TRUE)[,"row"]), NA))
}
getindexes(m, 0.5)
#> row col
#> [1,] 1 2
#> [2,] 2 NA
#> [3,] 3 NA
我们确实可以在没有 which
> v <- rowSums(col(m) * (m == 0.5))
> cbind(row = 1:nrow(m), col = v * NA^(!v))
row col
[1,] 1 2
[2,] 2 NA
[3,] 3 NA