我有一个庞大的数据集,大约有100万行,其中许多对象都会进行各种测量。对每个对象重复每个测量。我的数据集看起来有点像这样:
ID time measuremment1 measurement2 measurement3
1 5 12 324 123
1 6 123 654 45
1 3 346 556 548
2 2 234 345 253
2 8 35 998 316
2 17 515 1005 323
2 50 156 155 616
3 10 555 985 575
3 219 515 358 741
3 300 548 555 953
依旧......
我使用R读取文件
read.csv
我想要做的是,拆分并可能根据我的对象ID将数据集导出到单独的csv文件中。换句话说,我想为每个对象提供单独的csv文件。另外,我想要重新读取R中的文件,因为我想执行计算。 我想这样做是一个迭代过程,在R中键入几行,这样可以节省我的时间。 有谁知道怎么做?
谢谢
答案 0 :(得分:2)
<强>假设:强>
dat
; dat
已按ID
排序。我已经与你核实过这些条件是否满足。
由于数据框的大小,我不建议使用split
。相反,我建议 a&#34; read + write&#34;所有ID
子集的迭代过程。我们可以在skip
中使用nrows
和read.csv
参数来仅读取子集。
我们首先确定每个ID
的个案数量:
x <- rle(dat$ID) ## run length estimate
k <- x$lengths ## number of cases for each ID
ID <- x$values ## ID
然后我们确定每个ID
块开始的行:
s <- c(0L, cumsum(k)) + 1L
我们还存储此数据框的列名:
NAMES <- colnames(dat)
然后,我们从您的R会话中删除此大数据框dat
,然后执行&#34; read + save&#34;所有ID
块的迭代。
rm(dat); gc()
PATH <- getwd()
for (i in seq_along(ID)) {
## read in the data subset for the current `ID`
tmp <- read.csv("mydata.csv", skip = s[i], nrows = k[i], header = FALSE)
## `write.csv` does not allow `col.names`, so we use `write.table`
write.table(tmp, file = paste0(PATH,"/",ID[i],".csv"), row.names = FALSE,
sep = ",", col.names = NAMES)
}
在每次迭代中,只有一个子集被读入R会话,因此大大减少了内存占用。您可能希望自定义文件路径PATH
,因为目前所有文件都存储在您的工作总监getwd()
中。
让我们做一个小测试:
## example data frame
dat <- data.frame(ID=rep(1:3,each=5), val=sample(15))
NAMES <- colnames(dat)
x <- rle(dat$ID)
k <- x$lengths
ID <- x$values
s <- c(0L, cumsum(k)) + 1L
## store it into a csv file
write.csv(dat, file = "mydata.csv", row.names = FALSE)
## iterative "read + write"
PATH <- getwd()
for (i in seq_along(ID)) {
tmp <- read.csv("mydata.csv", skip = s[i], nrows = k[i], header = FALSE)
write.table(tmp, file = paste0(PATH,"/",ID[i],".csv"), row.names = FALSE,
sep = ",", col.names = NAMES)
}
执行后,我看到三个文件:&#34; 1.csv&#34;,&#34; 2.csv&#34;和&#34; 3.csv&#34;在我的工作目录中,每个都有所需的数据。所以一切都很成功。
答案 1 :(得分:0)
我认为最简单快捷的方法是使用.csv
。
library(data.table)
set(df)[, fwrite(.SD, paste0("subset_", ID,".csv")), by = ID, .SDcols=names(df) ]
文件.csv
# identify .csv files in the folder
filenames <- list.files( pattern=".csv", full.names=TRUE)
# read and rbind files
df <- rbindlist(lapply(filenames, fread))
文件{{1}}