我想在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))
我确实需要更深入地了解为什么会这样。