在第n个元素处将矢量拆分为数据帧

时间:2017-09-07 12:41:33

标签: r

我想在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

3 个答案:

答案 0 :(得分:5)

我们可以使用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)", "\\1\n ", a, perl = TRUE)))
#    V1 V2 V3 V4
#1:  a  1  2  3
#2:  b  5  6  7
#3:  c  8  9 11

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

这是另外一个警告,它为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(。,matrix(。,ncol = 2,byrow = TRUE))中: '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))

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