10

如何转换 data.frame

df <- data.frame(id=c("af1", "af2"), start=c(100, 115), end=c(114,121))

到列表列表

LoL <- list(list(id="af1", start=100, end=114), list(id="af2", start=115, end=121))

我试过像

not.LoL <- as.list(as.data.frame(t(df)))

而且我真的不确定在此之后我会得到什么,但这并不完全正确。我的要求是我可以start通过命令访问第一个

> LoL[[1]]$start
[1] 100

我目前拥有的not.LoL给我以下错误:

> not.LoL[[1]]$start
Error in not.LoL[[1]]$start : $ operator is invalid for atomic vectors

解释和/或解决方案将不胜感激。

编辑:我应该明确指出,这里的“id”实际上是非唯一的——一个 ID 下可以有多个元素。因此,我可以使用不依赖于唯一 ID 的解决方案split

4

5 回答 5

9
LMAo <- lapply(split(df,df$id), function(x) as.list(x)) # is one way

# more succinctly
# LMAo <- lapply(split(df,df$id), as.list)

根据您的评论编辑的解决方案:

lapply( split(df,seq_along(df[,1])), as.list)
于 2013-02-06T13:20:19.620 回答
7

使用plyr,您可以执行此操作

dlply(df,.(id),c)

为避免按 id 分组,如果有多个(也许您需要更改列名,id 对我来说是唯一的)

dlply(df,1,c)
于 2013-02-06T13:28:50.983 回答
7

您可以使用apply将数据框转换为列表列表,如下所示:

LoL <- apply(df,1,as.list)

但是,这会将您的所有数据更改为文本,因为它将单个原子向量传递给函数。

于 2013-02-06T14:27:25.820 回答
1

mapply在基础 R 中,使用它来代替splitor会快很多lapply- 但是,您必须通过调用它,do.call以便独立使用每一列。

df <- sleep

f <- function(df) {
  lapply(seq_len(nrow(df)), function(row) {
    df[row, , drop = FALSE]
  })
}

f2 <- function(df) {
  do.call("mapply", c(list, df, SIMPLIFY = FALSE, USE.NAMES=FALSE))
}

f3 <- function(df) {
  split(df, seq(nrow(df)))
}

microbenchmark::microbenchmark(f(df), f2(df), f3(df))
#> Unit: microseconds
#>    expr     min       lq     mean   median       uq       max neval
#>   f(df) 573.799 607.8375 759.1721 626.0095 752.9465  2861.961   100
#>  f2(df) 114.819 123.5190 155.5185 129.9210 141.4340  1375.573   100
#>  f3(df) 598.774 625.6025 813.6837 634.5855 684.3825 11230.678   100

reprex 包(v0.3.0)于 2019 年 10 月 9 日创建

于 2019-10-09T18:02:05.153 回答
0

如果像我一样,您主要希望创建要在中使用的列表列表highcharter,那么同一个包包含该函数list_parse()(或者list_parse2()如果您想删除名称)。只需像这样使用它:

library(highcharter)

df <- data.frame(id=c("af1", "af2"), start=c(100, 115), end=c(114,121))

LoL <- list_parse(df)

之后,您可以进行所需的索引:

> LoL[[1]]$start
[1] 100
于 2020-04-10T12:47:01.103 回答