簡體   English   中英

將 data.frame 轉換為列表列表

[英]Converting a data.frame to a list of lists

如何轉換 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的解決方案。

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)

使用plyr ,你可以做到這一點

dlply(df,.(id),c)

為避免按 id 分組,如果有多個(也許您需要更改列名,id 對我來說是唯一的)

dlply(df,1,c)

您可以使用apply將您的數據框變成這樣的列表:

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

但是,這會將您的所有數據更改為文本,因為它將單個原子向量傳遞給函數。

在基礎 R 中,使用mapply而不是splitlapply - 但是,您必須通過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 日創建

如果像我一樣,您主要希望創建要在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM