将特定数量的行转换为 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 万次,这是行不通的有效率的。有没有其他方法或任何东西可以用来有效地做到这一点?
【问题讨论】:
初始示例中没有C3
、C4
@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 中的列,并对大型数据集重复该过程的主要内容,如果未能解决你的问题,请参考以下文章