读取数据框列表的 CSV 并转换为数据框列表

时间:2021-03-17 09:05:08

标签: r list dataframe

我目前正在尝试读取包含长度不等的数据帧列表的 CSV 文件。在每个数据框的末尾,应该有 NA 值或字母列表来分隔每个数据框。是否可以基于此文件创建新的数据框列表?我相信这会减少我正在运行我的程序的计算机的内存问题。例如,下面的代码创建了一个包含两个数据框的列表。它由它们的列名分隔。

d1 <- data.frame(y1 = c(1, 2),
                 y2 = c(4, 5))
d2 <- data.frame(y1 = c(3, 2, 1),
                 y2 = c(6, 5, 4))
my.list <- list(d1, d2)
lapply(my.list, function(x) write.table(data.frame(x),
                                     '~/mylist.csv',
                                     append = TRUE, sep=','))

虽然我知道由于提供了第一列,因此名称不一定对应于正确的列。我仍然想知道是否可以将数据分离到数据框列表中,因为我的条目比提供的示例多得多。如果可以删除过程中的第一列会有帮助,但我认为没有必要,因为 [, -1] 在加载数据时似乎可以工作。

提前致谢。

1 个答案:

答案 0 :(得分:1)

通过在 row.names = FALSE 中设置 write.table 可以避免写入数据帧时的第一列问题。

lapply(my.list, function(x) 
       write.table(x,'mylist.csv',append = TRUE, sep=',', row.names = FALSE))

要从 mylist.csv 恢复数据帧列表,您可以:

#read the csv file
dat <- read.csv('mylist.csv')
#Create a group column to split the data
inds1 <- cumsum(dat[[1]] == names(dat)[1])
#Remove the rows where 1st column is equal to first column name.
inds2 <- dat[[1]] != names(dat)[1]
#split the data into list of dataframes
my.list <- split(dat[inds2, ], inds1[inds2])
my.list
#$`0`
#  y1 y2
#1  1  4
#2  2  5

#$`1`
#  y1 y2
#4  3  6
#5  2  5
#6  1  4