Расширить строки на основе произвольных N и M - PullRequest
1 голос
/ 05 марта 2020

Допустим, у меня есть параметр V, который равен 100 в строке v. У меня есть еще один параметр D в строке d, который тоже равен 100. Я хотел бы создать фрейм данных с N строками над строкой v и M строками под строкой d, чтобы v-N -ая строка равнялась V + Nf, а d+M -ая строка равна D - Mf. Для этого примера предположим, что f равно 5:

Ввод:

> dput(df)
structure(list(rw = structure(2:1, .Label = c("d", "v"), class = "factor"), 
    vals = c(100, 100)), class = "data.frame", row.names = c(NA, 
-2L))

Ожидаемый результат:

> dput(df)
structure(list(rw = structure(c(8L, 7L, 6L, 5L, 1L, 2L, 3L, 4L
), .Label = c("d", "d+1", "d+2", "d+M", "v", "v-1", "v-2", "v-N"
), class = "factor"), vals = c(85, 90, 95, 100, 100, 105, 110, 
115)), class = "data.frame", row.names = c(NA, -8L))

Как мне добиться это? Дайте знать, если у вас появятся вопросы. Спасибо!

1 Ответ

2 голосов
/ 05 марта 2020

Мы можем использовать Map с seq для создания последовательности значений, циклически перебирая строки столбца 'vals', а затем передавая другую переменную byval со знаком для получения последовательности вперед или назад для каждого соответствующего элемента значения 'vals' и передайте его аргументу by в seq, одновременно устанавливая постоянную длину последовательности для вывода в виде 4 ('n'). Затем задайте имена list с колонкой 'rw' и преобразуйте list в двухстоечный файл data.frame с stack

byval <- 5
n <- 4
stack(setNames(Map(function(x, y) sort(seq(x, length.out = n, by = y)),
              df$vals, c(-byval, byval)), df$rw))[2:1]

Если нам нужны другие length.out, передать его в качестве другого параметра

n1 <- 6
n2 <- 5
stack(setNames(Map(function(x, y, z) sort(seq(x, length.out = z, by = y)),
              df$vals, c(-byval, byval), c(n1, n2)), df$rw))[2:1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...