将特定数量的行转换为 R 中的列,并对大型数据集重复该过程

Posted

技术标签:

【中文标题】将特定数量的行转换为 R 中的列,并对大型数据集重复该过程【英文标题】:Convert specific number of rows to columns in R and repeat the process for a large dataset 【发布时间】:2018-04-25 18:24:32 【问题描述】:

我有一个包含 1500 万行的单列数据集。看起来,

x_raw
A1
A2
A3
A4
B1
B2
B3
B4
C1
C2

I want to convert it to

A1 A2 A3 A4
B1 B2 B3 B4
C1 C2 C3 C4

我正在尝试使用“for”循环,它将每 4 行转置一次,并将它们添加到“最终”数据帧中,但由于数据集太大,它会迭代近 270 万次,这是行不通的有效率的。有没有其他方法或任何东西可以用来有效地做到这一点?

【问题讨论】:

初始示例中没有C3C4 @akrun 数据就是这样...... C 和 D 等等......多达 1500 万行...... 如果它每四行不会更快地将向量转换为矩阵? @zacdav 是的...我是在看到 cmets 后才知道的。我是新手所以... :) 【参考方案1】:

这是tidyverse 的一个选项,其中separate 'x_raw' 分为两列,然后spread 为'wide' 格式

library(dplyr)
library(tidyr)
separate(df1, x_raw, into = c('x', 'rn'), sep="(?=\\d+)", remove = FALSE) %>%
       spread(rn, x_raw) %>% 
       select(-x)
#   1  2    3    4
#1 A1 A2   A3   A4
#2 B1 B2   B3   B4
#3 C1 C2 <NA> <NA>

或者如果元素个数总是4,那么我们也可以这样做

as.data.frame(matrix(df1$x_raw, ncol =4, byrow = TRUE), stringsAsFactors=FALSE)

【讨论】:

【参考方案2】:

如果您只想转换为四列数据框:

as.data.frame(matrix(df$x_raw,ncol=4,byrow = T))

【讨论】:

【参考方案3】:

看到这个,

x_raw <- c("A1","A2","A3","A4","B1","B2","B3","B4","C1","C2","C3","C4","D1","D2","D3","D4")
x <- as.table(matrix(x_raw,ncol=4,byrow = T))
rownames(x) <- NULL
colnames(x) <- NULL
print(x)

返回:

     [,1] [,2] [,3] [,4]
[1,] A1   A2   A3   A4
[2,] B1   B2   B3   B4  
[3,] C1   C2   C3   C4 
[4,] D1   D2   D3   D4

【讨论】:

【参考方案4】:

将长度扩展到下一个 4 个值的块,并将其放入矩阵中:

matrix(`length<-`(dat$x_raw, (nrow(dat) %/% 4 + 1) * 4), ncol=4, byrow=TRUE)

#     [,1] [,2] [,3] [,4]
#[1,] "A1" "A2" "A3" "A4"
#[2,] "B1" "B2" "B3" "B4"
#[3,] "C1" "C2" NA   NA

【讨论】:

我不确定将其纳入一行的努力是否容易理解

以上是关于将特定数量的行转换为 R 中的列,并对大型数据集重复该过程的主要内容,如果未能解决你的问题,请参考以下文章

获取具有特定数量的重复值的行

r shiny - DataTableOutput - 颜色特定的行和列

如何将具有排名值的列转换为oracle中的行

将特定行重塑为 R 中的列

通过匹配相似的行来解构 R 中的列?

将 DataFrame 转换为 RDD 并将 RDD 动态拆分为与 DataFrame 相同数量的 Columns