矩阵的整洁语法可通过索引修改



我有一个矩阵foo,想要创建一个data.frame或类似bar的tibble,其中数据为长格式,索引为列。有什么简单的方法可以在花絮中做到这一点?

z <- c(1,8,6,4,7,3,2,4,7)
foo <- matrix(z,3,3)
bar <- expand.grid(j=1:3,i=1:3)
bar$z <- z
foo
bar

这里有两种方法
第一个实际上是一个基本的R解决方案,只需为R的本地管道操作符|>更改magrittr的管道即可
第二个是一个小问题的解决方案,我觉得太复杂了。

suppressPackageStartupMessages(
library(tidyverse)
)
z <- c(1,8,6,4,7,3,2,4,7)
foo <- matrix(z,3,3)
bar <- expand.grid(j=1:3,i=1:3)
bar$z <- z
cbind(
i = foo %>% row() %>% c(),
j = foo %>% col() %>% c(),
z = foo %>% c()
) %>%
as.data.frame()
#>   i j z
#> 1 1 1 1
#> 2 2 1 8
#> 3 3 1 6
#> 4 1 2 4
#> 5 2 2 7
#> 6 3 2 3
#> 7 1 3 2
#> 8 2 3 4
#> 9 3 3 7

foo %>%
t() %>%
as.data.frame() %>%
pivot_longer(everything(), values_to = "z") %>%
mutate(i = c(row(foo)), j = c(col(foo))) %>%
select(-name) %>%
relocate(z, .after = j)
#> # A tibble: 9 × 3
#>       i     j     z
#>   <int> <int> <dbl>
#> 1     1     1     1
#> 2     2     1     8
#> 3     3     1     6
#> 4     1     2     4
#> 5     2     2     7
#> 6     3     2     3
#> 7     1     3     2
#> 8     2     3     4
#> 9     3     3     7

创建于2022-10-12使用reprex v2.0.2

另一种基本的R方法是利用as.tableas.data.frame

as.data.frame(lapply(as.data.frame(as.table(foo)), as.numeric), 
col.names = c("row", "col", "val"))
#>   row col val
#> 1   1   1   1
#> 2   2   1   8
#> 3   3   1   6
#> 4   1   2   4
#> 5   2   2   7
#> 6   3   2   3
#> 7   1   3   2
#> 8   2   3   4
#> 9   3   3   7

最新更新