data.frame行到列表

我有一个data.frame,我想按行将其转换为列表,这意味着每行将对应于其自己的列表元素。换句话说,我想要一个只要data.frame有行的列表。


到目前为止,我已经按照以下方式解决了这个问题,但是我想知道是否有更好的方法来解决这个问题。


xy.df <- data.frame(x = runif(10),  y = runif(10))


# pre-allocate a list and fill it with a loop

xy.list <- vector("list", nrow(xy.df))

for (i in 1:nrow(xy.df)) {

    xy.list[[i]] <- xy.df[i,]

}


MM们
浏览 612回答 3
3回答

墨色风雨

像这样:xy.list <- split(xy.df, seq(nrow(xy.df)))而且,如果希望xy.df将行名作为输出列表的名称,则可以执行以下操作:xy.list <- setNames(split(xy.df, seq(nrow(xy.df))), rownames(xy.df))

人到中年有点甜

今天,我正在为一个具有数百万个观测值和35列的data.frame(实际上是一个data.table)进行此工作。我的目标是返回一个data.frames(data.tables)列表,每个列表只有一行。也就是说,我想将每一行拆分为一个单独的data.frame并将它们存储在列表中。这是我想出的两种方法,它们的速度大约比split(dat, seq_len(nrow(dat)))该数据集快3倍。下面,我在7500行,5列数据集上对这三种方法进行了基准测试(虹膜重复了50次)。library(data.table)library(microbenchmark)microbenchmark(split={dat1 <- split(dat, seq_len(nrow(dat)))},setDF={dat2 <- lapply(seq_len(nrow(dat)),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; function(i) setDF(lapply(dat, "[", i)))},attrDT={dat3 <- lapply(seq_len(nrow(dat)),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;function(i) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;tmp <- lapply(dat, "[", i)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;attr(tmp, "class") <- c("data.table", "data.frame")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setDF(tmp)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;})},datList = {datL <- lapply(seq_len(nrow(dat)),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; function(i) lapply(dat, "[", i))},times=20)&nbsp;这返回Unit: milliseconds&nbsp; &nbsp; &nbsp; &nbsp;expr&nbsp; &nbsp; &nbsp; min&nbsp; &nbsp; &nbsp; &nbsp;lq&nbsp; &nbsp; &nbsp;mean&nbsp; &nbsp;median&nbsp; &nbsp; &nbsp; &nbsp; uq&nbsp; &nbsp; &nbsp; &nbsp;max neval&nbsp; &nbsp; &nbsp; split 861.8126 889.1849 973.5294 943.2288 1041.7206 1250.6150&nbsp; &nbsp; 20&nbsp; &nbsp; &nbsp; setDF 459.0577 466.3432 511.2656 482.1943&nbsp; 500.6958&nbsp; 750.6635&nbsp; &nbsp; 20&nbsp; &nbsp; &nbsp;attrDT 399.1999 409.6316 461.6454 422.5436&nbsp; 490.5620&nbsp; 717.6355&nbsp; &nbsp; 20&nbsp; &nbsp; datList 192.1175 201.9896 241.4726 208.4535&nbsp; 246.4299&nbsp; 411.2097&nbsp; &nbsp; 20尽管差异没有我以前的测试中的大,但是setDF在max(setDF)<min(split)的运行分布的所有级别上,直接方法都明显更快,并且该attr方法通常快两倍以上。第四种方法是极端冠军,它是一个简单的嵌套lapply,返回嵌套列表。此方法举例说明了从列表构造data.frame的成本。而且,我使用该data.frame函数尝试的所有方法都比data.table技术慢了一个数量级。数据dat <- vector("list", 50)for(i in 1:50) dat[[i]] <- irisdat <- setDF(rbindlist(dat))
打开App,查看更多内容
随时随地看视频慕课网APP