1
votes

Diviser le dataframe en une liste avec des vecteurs de longueurs inégales

Supposons que j'ai un dataframe avec 10 lignes et 5 colonnes comme ceci

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

Je veux diviser le dataframe en une liste avec 5 vecteurs de longueur inégale, où le premier vecteur commence par le premier ligne de la première colonne, le deuxième vecteur commence par la deuxième ligne de la colonne deux, et ainsi de suite. Je fournirai l'index où chacun des vecteurs se terminera. Par exemple, si ce vecteur d'index est c (3, 5, 4, 8, 10) alors je m'attends à ce que la liste soit list (1: 3, 2: 5, 3: 4 , 4: 8, 5:10) . Merci!


3 commentaires

Je suis étonné de la rapidité de réponse des gens et de la qualité des réponses. Cela m'a littéralement fait gagner des heures. Tous répondent à ma question, je les ai donc votés mais je ne peux pas en choisir un par rapport à l'autre. Merci beaucoup!


Je comprends le dilemme, bien que choisir l’un par rapport à l’autre soit en partie pour le répondant et en partie pour la communauté: cela marque la question comme résolue .


@ r2evans bien, j'en ai choisi un. Merci.


3 Réponses :


4
votes
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

0 commentaires

1
votes
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

0 commentaires

2
votes

Une option est imap qui, par défaut, a une séquence comme .y lorsque le vecteur de liste est sans nom

v1 <- c(3, 5, 4, 8, 10)


0 commentaires