簡體   English   中英

將 dataframe 拆分為具有不等長度向量的列表

[英]Split dataframe into a list with vectors of unequal lengths

假設我有一個像這樣有 10 行和 5 列的 dataframe

df <- data.frame(matrix(rep(1:10, 5), ncol=5))

我想將 dataframe 拆分為一個包含 5 個長度不等的向量的列表,其中第一個向量從第一列的第一行開始,第二個向量從第二列的第二行開始,依此類推。 我將提供每個向量應結束的索引。 例如,如果這個索引向量是c(3, 5, 4, 8, 10)那么我希望列表是list(1:3, 2:5, 3:4, 4:8, 5:10) 謝謝!

Map(function(x, a, b) x[a:b], df, seq_along(df), c(3, 5, 4, 8, 10))
# $X1
# [1] 1 2 3
# $X2
# [1] 2 3 4 5
# $X3
# [1] 3 4
# $X4
# [1] 4 5 6 7 8
# $X5
# [1]  5  6  7  8  9 10

一個選項是imap ,當list的向量未命名時,默認情況下其序列為.y

library(purrr)
imap(v1, ~ .y:.x)
#[[1]]
#[1] 1 2 3

#[[2]]
#[1] 2 3 4 5

#[[3]]
#[1] 3 4

#[[4]]
#[1] 4 5 6 7 8

#[[5]]
#[1]  5  6  7  8  9 10

數據

v1 <- c(3, 5, 4, 8, 10)
x = c(3, 5, 4, 8, 10)
lapply(seq_along(x), function(i) df[cbind(i:x[i], i)])
#[[1]]
#[1] 1 2 3

#[[2]]
#[1] 2 3 4 5

#[[3]]
#[1] 3 4

#[[4]]
#[1] 4 5 6 7 8

#[[5]]
#[1]  5  6  7  8  9 10

或者

x = c(3, 5, 4, 8, 10)
i = rep(seq_along(x), x - seq_along(x) + 1)
split(df[cbind(i + sequence(rle(i)$lengths) - 1, i)], names(df)[i])
#$X1
#[1] 1 2 3

#$X2
#[1] 2 3 4 5

#$X3
#[1] 3 4

#$X4
#[1] 4 5 6 7 8

#$X5
#[1]  5  6  7  8  9 10

暫無
暫無

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

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