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