Разделить информационный кадр на список с векторами неравной длины - PullRequest
1 голос
/ 20 сентября 2019

Предположим, у меня есть фрейм данных с 10 строками и 5 столбцами, подобными этому

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

Я хочу разбить фрейм данных на список с 5 векторами неравной длины, где первый вектор начинается с первой строкипервый столбец, второй вектор начинается со второй строки второго столбца и так далее.Я приведу указатель, где должен заканчиваться каждый из векторов.Например, если этот индексный вектор равен c(3, 5, 4, 8, 10), то я ожидаю, что список будет list(1:3, 2:5, 3:4, 4:8, 5:10).Спасибо!

Ответы [ 3 ]

4 голосов
/ 20 сентября 2019
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
2 голосов
/ 20 сентября 2019

Опция imap, которая по умолчанию имеет последовательность как .y, когда вектор list не назван

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

data

v1 <- c(3, 5, 4, 8, 10)
1 голос
/ 20 сентября 2019
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...