我有一個存盤在串列中的串列df_list(下面的示例代碼)。我想將其轉換為資料框,但我想保留一個計數器 count,以便它跟蹤資料來自哪個串列。
我希望最終產品看起來像這樣:
count replicate level high.density low.density
1 1 low 54 36
1 1 low 54 31
1 2 low 11 28
1 2 low 11 45
1 1 mid 24 10
1 2 mid 12 24
1 2 mid 12 17
1 2 up 40 2
2 1 low 54 31
2 1 low 54 31
2 2 low 11 45
2 2 low 11 28
2 1 mid 24 10
2 2 mid 12 24
2 2 up 20 2
......
1000 2 up 40 5
#List 代碼串列
df <- structure(list(replicate = c(1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2), level = c("low", "low", "mid", "mid", "low", "low", "mid", "mid", "up", "up", "up"), high.density = c(14, 54, 82, 24, 12, 11, 12, NA, 40, NA, 20), low.density = c(36, 31, 10,
NA, 28, 45, 17, 24, 10, 5, 2)), class = c("spec_tbl_df","tbl_df","tbl", "data.frame"), row.names = c(NA, -11L), spec = structure(list(cols = list(replicate = structure(list(), class = c("collector_double", "collector")), level = structure(list(), class = c("collector_character","collector")), high.density = structure(list(), class = c("collector_double","collector")), low.density = structure(list(), class = c("collector_double",
"collector"))), default = structure(list(), class = c("collector_guess", "collector")), skip = 1L), class = "col_spec"))
df$replicate <- as.factor(as.numeric(df$replicate))
df$level <- as.factor(as.character(df$level))
df_shuffle <- function(DF) {
my_split <- split(DF, f = ~ DF$replicate DF$level)
shuffle <- lapply(my_split, \(x) {
nrX <- nrow(x)
cbind(x[, c('replicate', 'level')],
high.density = x[sample(seq_len(nrX), replace = TRUE), 'high.density'],
low.density = x[sample(seq_len(nrX), replace = TRUE), 'low.density'])
})
DF_new <- do.call(rbind, shuffle)
rownames(DF_new) <- NULL
return(DF_new)
}
B <- 1000
df_list <- replicate(B, df_shuffle(df), simplify = FALSE)
uj5u.com熱心網友回復:
或者,我們可以簡單地利用data.table::rbindlist()函式:
library(data.table)
rbindlist(df_list, idcol = 'count')
# count replicate level high.density low.density
# 1: 1 1 low 14 31
# 2: 1 1 low 14 31
# 3: 1 2 low 12 45
# 4: 1 2 low 12 45
# 5: 1 1 mid 24 NA
# ---
# 10996: 1000 2 mid NA 17
# 10997: 1000 2 mid NA 17
# 10998: 1000 2 up 20 10
# 10999: 1000 2 up 20 5
# 11000: 1000 2 up 40 2
uj5u.com熱心網友回復:
dplyr::bind_rows我們可以通過指定.id引數來添加包含索引或串列元素名稱的列。如果串列有名稱bind_rows將添加那些,否則它將采用索引(我們無法選擇bind_rows應該采用哪一個)。
df_list %>%
bind_rows(., .id = "count")
如果我們想超越這一點,或者如果串列有名稱并且我們想使用索引,我們可以使用purrr::imap并將結果傳遞給bind_rows:
library(tidyverse)
imap(df_list,
~ mutate(.x,
count = .y,
.before = "replicate")) %>%
bind_rows()
#> count replicate level high.density low.density
#> 1 1 1 low 14 31
#> 2 1 1 low 14 36
#> 3 1 2 low 11 45
#> 4 1 2 low 12 28
#> 5 1 1 mid 24 10
#> 6 1 1 mid 24 10
#> 7 1 2 mid 12 17
#> 8 1 2 mid NA 17
#> 9 1 2 up 40 5
#> 10 1 2 up 20 5
#> 11 1 2 up 20 5
#> 12 2 1 low 14 31
#> 13 2 1 low 54 31
#> ...
由reprex 包于 2022-01-20 創建(v2.0.1)
在imap我們為每個data.frame .x使用mutate. 新列被呼叫count并且.y是每個串列元素的索引。我們使用mutates.before引數使該列成為每個 s 的第一列data.frame。呼叫的結果 imap是一個data.frames 串列,我們將它們合并成一個大data.frame的 with dplyr::bind_rows。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/420234.html
標籤:
