我正在尝试编写一个函数:
我使用以下代码获取了x ==“pos”的行和列数字
col.numbers <- which(change.matrix2 =="pos", arr.ind=TRUE)
我在函数中使用此代码,因此change.matrix2具有完全相同的结构,并且它始终是数据框。
我注意到我得到了不同结构的col.numbers,我不知道为什么。
这是我得到的:
示例1:
> col.numbersA
row col
1 8
> str(col.numbersA)
Named int [1:2] 1 8
- attr(*, "names")= chr [1:2] "row" "col"
> is.integer(col.numbersA)
[1] TRUE
我希望将其转换为具有相同结构的数据框,因此我使用
> as.data.frame(t(col.numbersA))
row col
1 1 8
它有效!
示例2:
> col.numbersB
row col
10 1 10
4 2 15
11 3 10
3 4 15
5 5 40
5 5 41
12 6 10
1 7 3
6 8 40
7 9 43
9 10 44
2 11 3
8 12 43
> str(col.numbersB)
int [1:13, 1:2] 1 2 3 4 5 5 6 7 8 9 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:13] "10" "4" "11" "3" ...
..$ : chr [1:2] "row" "col"
> is.integer(col.numbersB)
[1] TRUE
但是当我使用与示例1中相同的代码将其转换为数据框时,我得到了这个:
> as.data.frame(t(col.numbersB))
10 4 11 3 5 5 12 1 6 7 9 2 8
row 1 2 3 4 5 5 6 7 8 9 10 11 12
col 10 15 10 15 40 41 10 3 40 43 44 3 43
但是我想保留col.numersB的结构,即它的转置。
有没有人知道如何从整数到data.frame进行编码而不会丢失col.numbers的结构(或维度)?
答案 0 :(得分:1)
col.numbersA
似乎是一个命名向量,而col.numbersB
是一个矩阵。
您可以在决定是否进行转置之前检查尺寸。作为一个简单的函数,你可以尝试类似的东西:
myfun <- function(input) {
if (is.null(dim(input))) as.data.frame(t(input)) else as.data.frame(input)
}
示例:
set.seed(1)
M <- matrix(c(12, sample(5, 24, TRUE)), ncol = 5)
M
A <- setNames(c(1L, 2L), c("row", "col"))
B <- which(M == 4, arr.ind = TRUE)
myfun(A)
myfun(B)
您可能想要尝试弄清楚如何使用命名向量而不是单行矩阵进行单个匹配。下面给出了一个单行矩阵,而不是像你所示的命名向量。并且arr.ind
应该始终这样做....
which(M == 12, arr.ind = TRUE)