![](/img/trans.png)
[英]In R: How to coerce a list of vectors with unequal length to a dataframe using tidyverse?
[英]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.