Генерация последовательностей данных в кадре данных с переменной длиной для каждой группы дублированных данных - PullRequest
0 голосов
/ 12 июня 2018

У меня есть фрейм данных, и у меня есть дублированные строки, основанные на разнице между двумя датами: Дата (дата сбора образцов) и штриховка (дата рождения) с использованием следующего кода.Разница (в основном продолжительность жизни в месяцах) варьируется от 4 до 12 месяцев:

library(zoo)
test$difference <- 12 * as.numeric(as.yearmon(test$Date) - as.yearmon(test$hatch))

test$difference <- ceiling(test$difference)
test2 <- test[rep(row.names(test), test$difference),]

Мне нужно создать последовательность для каждого образца (каждый из которых имеет уникальный серийный номер, sn), начиная с даты штриховки,увеличивается с шагом в 1 месяц и имеет длину, равную значению в столбце различий.Я пробовал цикл, но я не мог понять, как его сформулировать, так как я совсем новичок в R.

На данный момент даты имеют формат% Y-% m-% d, но яинтересует только месяц и год группировки.

Любые идеи были бы действительно полезны:)

    structure(list(Sex = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("F", "J", "M"), class = "factor"), 
    Maturity = c(5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
    5L, 5L, 5L, 5L), XLength = c(12, 12, 12, 12, 12, 12, 12, 
    12, 12, 16.5, 16.5, 16.5, 16.5, 16.5, 16.5), Weight = c(44.1, 
    44.1, 44.1, 44.1, 44.1, 44.1, 44.1, 44.1, 44.1, 73.6, 73.6, 
    73.6, 73.6, 73.6, 73.6), Ringcount = c(232L, 232L, 232L, 
    232L, 232L, 232L, 232L, 232L, 232L, 225L, 225L, 225L, 225L, 
    225L, 225L), Date = structure(c(10480, 10480, 10480, 10480, 
    10480, 10480, 10480, 10480, 10480, 10480, 10480, 10480, 10480, 
    10480, 10480), class = "Date"), hatch = structure(c(10248, 
    10248, 10248, 10248, 10248, 10248, 10248, 10248, 10248, 10255, 
    10255, 10255, 10255, 10255, 10255), class = "Date"), sn = c(1, 
    1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2), difference = c(9, 
    9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9)), .Names = c("Sex", 
"Maturity", "XLength", "Weight", "Ringcount", "Date", "hatch", 
"sn", "difference"), row.names = c(NA, 15L), class = "data.frame")

1 Ответ

0 голосов
/ 13 июня 2018

1) Предполагая, что вы хотите добавить новый столбец с датами, используя test, мы можем написать следующее.Он не использует никаких пакетов.

Seq <- function(h) seq(h[1], length = length(h), by = "month")
transform(test, dates = ave(hatch, sn, FUN = Seq))

, давая:

   Sex Maturity XLength Weight Ringcount       Date      hatch sn difference      dates
1    M        5    12.0   44.1       232 1998-09-11 1998-01-22  1          9 1998-01-22
2    M        5    12.0   44.1       232 1998-09-11 1998-01-22  1          9 1998-02-22
3    M        5    12.0   44.1       232 1998-09-11 1998-01-22  1          9 1998-03-22
4    M        5    12.0   44.1       232 1998-09-11 1998-01-22  1          9 1998-04-22
5    M        5    12.0   44.1       232 1998-09-11 1998-01-22  1          9 1998-05-22
6    M        5    12.0   44.1       232 1998-09-11 1998-01-22  1          9 1998-06-22
7    M        5    12.0   44.1       232 1998-09-11 1998-01-22  1          9 1998-07-22
8    M        5    12.0   44.1       232 1998-09-11 1998-01-22  1          9 1998-08-22
9    M        5    12.0   44.1       232 1998-09-11 1998-01-22  1          9 1998-09-22
10   M        5    16.5   73.6       225 1998-09-11 1998-01-29  2          9 1998-01-29
11   M        5    16.5   73.6       225 1998-09-11 1998-01-29  2          9 1998-03-01
12   M        5    16.5   73.6       225 1998-09-11 1998-01-29  2          9 1998-03-29
13   M        5    16.5   73.6       225 1998-09-11 1998-01-29  2          9 1998-04-29
14   M        5    16.5   73.6       225 1998-09-11 1998-01-29  2          9 1998-05-29
15   M        5    16.5   73.6       225 1998-09-11 1998-01-29  2          9 1998-06-29

2) В качестве альтернативы, если вы просто хотите, чтобы год и месяц использовали yearmon класс из зоопарка.

library(zoo)

Seq_ym <- function(h) h[1] + (seq_along(h) - 1) / 12
transform(test, dates = ave(as.yearmon(hatch), sn, FUN = Seq_ym))

дача:

   Sex Maturity XLength Weight Ringcount       Date      hatch sn difference    dates
1    M        5    12.0   44.1       232 1998-09-11 1998-01-22  1          9 Jan 1998
2    M        5    12.0   44.1       232 1998-09-11 1998-01-22  1          9 Feb 1998
3    M        5    12.0   44.1       232 1998-09-11 1998-01-22  1          9 Mar 1998
4    M        5    12.0   44.1       232 1998-09-11 1998-01-22  1          9 Apr 1998
5    M        5    12.0   44.1       232 1998-09-11 1998-01-22  1          9 May 1998
6    M        5    12.0   44.1       232 1998-09-11 1998-01-22  1          9 Jun 1998
7    M        5    12.0   44.1       232 1998-09-11 1998-01-22  1          9 Jul 1998
8    M        5    12.0   44.1       232 1998-09-11 1998-01-22  1          9 Aug 1998
9    M        5    12.0   44.1       232 1998-09-11 1998-01-22  1          9 Sep 1998
10   M        5    16.5   73.6       225 1998-09-11 1998-01-29  2          9 Jan 1998
11   M        5    16.5   73.6       225 1998-09-11 1998-01-29  2          9 Feb 1998
12   M        5    16.5   73.6       225 1998-09-11 1998-01-29  2          9 Mar 1998
13   M        5    16.5   73.6       225 1998-09-11 1998-01-29  2          9 Apr 1998
14   M        5    16.5   73.6       225 1998-09-11 1998-01-29  2          9 May 1998
15   M        5    16.5   73.6       225 1998-09-11 1998-01-29  2          9 Jun 1998
...