如何将 4 行数据帧转换为 R 中的 2*2 矩阵?

Posted

技术标签:

【中文标题】如何将 4 行数据帧转换为 R 中的 2*2 矩阵?【英文标题】:How to convert a 4 rows dataframe to 2*2 matrix in R? 【发布时间】:2021-11-10 18:59:25 【问题描述】:

我有一个这样的数据框:

name  number
A     287        
B     1390       
C     1595       
D     369

我想得到一个像这样的数字数据矩阵:

287  369
1390 1595

按照这个顺序:

A  D
B  C

这意味着A和B在左列,D和C在右列。顺序很重要。 我怎样才能只用我想要的序列制作数字矩阵?谢谢!

【问题讨论】:

【参考方案1】:

我们可以sort 'number' 列并使用matrix 创建矩阵

matrix(sort(df1$number), 2, 2,byrow = TRUE)

-输出

     [,1] [,2]
[1,]  287  369
[2,] 1390 1595

或者如果需要基于'name'列

library(dplyr)
library(tidyr)
library(data.table)
df1 %>% 
   mutate(grp = 1 + !name %in% c("A", "D"), rn = rowid(grp), 
       name = NULL) %>% 
   pivot_wider(names_from = rn, values_from = number) %>% 
   select(-grp) %>%
   as.matrix

-输出

        1    2
[1,]  287  369
[2,] 1390 1595

数据

df1 <- structure(list(name = c("A", "B", "C", "D"), number = c(287L, 
1390L, 1595L, 369L)), class = "data.frame", row.names = c(NA, 
-4L))

【讨论】:

【参考方案2】:

以下也是一种选择。

library(dplyr)

df %>%
  filter(name %in% c('A', 'B')) %>%
  bind_cols(filter(df, name %in% c('C', 'D'))) %>%
  select(where(~is.integer(.))) %>%
  as.matrix() %>%
  unname()

#       [,1] [,2]
# [1,]  287 1595
# [2,] 1390  369

数据

df <- structure(list(name = c("A", "B", "C", "D"), number = c(287L, 
1390L, 1595L, 369L)), class = "data.frame", row.names = c(NA, 
-4L))

【讨论】:

以上是关于如何将 4 行数据帧转换为 R 中的 2*2 矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 R 中的条件语句将数据帧拆分为多个数据帧

如何将矩阵转换为R中的列向量列表?

Rcpp - 从矩阵/数据帧列表中提取行

如何将向量附加为 R 矩阵中的列?

如何将频率分布转换为R中的概率分布

如何使用 R 中的 TM 包将我的语料库元数据附加到我的 dtm 数据帧导出中