在每个nth元素处将向量分解为数据框



我想在R中执行以下任务。这是字符向量:

a <- c("a", "1", "2", "3", "b", "5", "6", "7", "c", "8", "9", "11")

将A转换为看起来像这样的数据框架:

a 1 2 3
b 5 6 7
c 8 9 11

我们可以使用 matrix

as.data.frame(matrix(a, ncol = 4,  byrow = TRUE), stringsAsFactors = FALSE)

基于OP的初始文章,似乎数据是一个字符串。如果是这种情况

a <- "a; 1; 2; 3; b; 5; 6; 7; c; 8; 9; 11"
library(data.table)
fread(gsub(";", "",  gsub("((\S+\s+){3}\S+)(\s)", "\1n ", a, perl = TRUE)))
#    V1 V2 V3 V4
#1:  a  1  2  3
#2:  b  5  6  7
#3:  c  8  9 11

首先制作一个矩阵,向其添加行名并将其转换为数据框架。

a <- c("a", "1", "2", "3", "b", "5", "6", "7", "c", "8", "9", "11")
foo <- matrix(as.numeric(a[-seq(1, 9, 4)]), 3, byrow = TRUE)
rownames(foo) <- a[seq(1, 9, 4)]
data.frame(foo)
  X1 X2 X3
a  1  2  3
b  5  6  7
c  8  9 11

这是一个谨慎的故事,它增加了现有答案,对于tidyverse用户(像我一样)可以自动使用管道来做所有事物:将矢量转换为数据帧,单管操作可能有些棘手。请参阅以下行为:

a <- seq(4)
a %>% 
  matrix(., ncol = 2,  byrow = TRUE)
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
a %>%
  as.data.frame(matrix(., ncol = 2,  byrow = TRUE))
##   .
## 1 1
## 2 2
## 3 3
## 4 4

警告消息: 在as.data.frame.integer中 'row.names'不是长度4的字符向量 - 省略它。将是一个错误!

a %>%
  as.data.frame(x = matrix(., ncol = 2,  byrow = TRUE))
##   V1 V2
## 1  1  2
## 2  3  4
a %>%
  as_tibble(matrix(., ncol = 2,  byrow = TRUE))
## # A tibble: 4 x 1
##   value
##   <int>
## 1     1
## 2     2
## 3     3
## 4     4
a %>%
  as_tibble(x = matrix(., ncol = 2,  byrow = TRUE))
## Error in .name_repair != name_repair : 
##   comparison (2) is possible only for atomic and list types

因此,有目的的是

a %>%
  as.data.frame(x = matrix(., ncol = 2,  byrow = TRUE))

我确实需要更深入地了解为什么会这样。

最新更新