Вложение данных для пустых подмножественных кадров данных в R - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь построить функцию в R, в которой я могу поднастроить свой необработанный кадр данных в соответствии с некоторыми спецификациями, а затем преобразовать этот подмножественный кадр данных в таблицу пропорций.

К сожалению, некоторые из этих поднаборов даютна пустой фрейм данных, так как для некоторых конкретных спецификаций у меня нет данных;следовательно, никакая таблица пропорций не может быть рассчитана.Итак, я хотел бы взять ближайший временной шаг, из которого у меня есть непустой поднабор данных, и использовать его в качестве входных данных для пустого поднабора данных.

Вот некоторые сведения о моем фрейме данных ифункция:

Мой необработанный кадр данных выглядит +/- следующим образом:

| year | quarter | area | time_comb | no_individuals | lenCls | age |
|------|---------|------|-----------|----------------|--------|-----|
| 2005 | 1       | 24   | 2005.1.24 | 8              | 380    | 3   |
| 2005 | 2       | 24   | 2005.2.24 | 4              | 490    | 2   |
| 2005 | 1       | 24   | 2005.1.24 | 3              | 460    | 6   |
| 2005 | 1       | 21   | 2005.1.21 | 25             | 400    | 2   |
| 2005 | 2       | 24   | 2005.2.24 | 1              | 680    | 6   |
| 2005 | 2       | 21   | 2005.2.21 | 2              | 620    | 5   |
| 2005 | 3       | 21   | 2005.3.21 | NA             | NA     | NA  |
| 2005 | 1       | 21   | 2005.1.21 | 1              | 510    | 5   |
| 2005 | 1       | 24   | 2005.1.24 | 1              | 670    | 4   |
| 2006 | 1       | 22   | 2006.1.22 | 2              | 750    | 4   |
| 2006 | 4       | 24   | 2006.4.24 | 1              | 660    | 8   |
| 2006 | 2       | 24   | 2006.2.24 | 8              | 540    | 3   |
| 2006 | 2       | 24   | 2006.2.24 | 4              | 560    | 3   |
| 2006 | 1       | 22   | 2006.1.22 | 2              | 250    | 2   |
| 2006 | 3       | 22   | 2006.3.22 | 1              | 520    | 2   |
| 2006 | 2       | 24   | 2006.2.24 | 1              | 500    | 2   |
| 2006 | 2       | 22   | 2006.2.22 | NA             | NA     | NA  |
| 2006 | 2       | 21   | 2006.2.21 | 3              | 480    | 2   |
| 2006 | 1       | 24   | 2006.1.24 | 1              | 640    | 5   |
| 2007 | 4       | 21   | 2007.4.21 | 2              | 620    | 3   |
| 2007 | 2       | 21   | 2007.2.21 | 1              | 430    | 3   |
| 2007 | 4       | 22   | 2007.4.22 | 14             | 410    | 2   |
| 2007 | 1       | 24   | 2007.1.24 | NA             | NA     | NA  |
| 2007 | 2       | 24   | 2007.2.24 | NA             | NA     | NA  |
| 2007 | 3       | 24   | 2007.3.22 | NA             | NA     | NA  |
| 2007 | 4       | 24   | 2007.4.24 | NA             | NA     | NA  |
| 2007 | 3       | 21   | 2007.3.21 | 1              | 560    | 4   |
| 2007 | 1       | 21   | 2007.1.21 | 7              | 300    | 3   |
| 2007 | 3       | 23   | 2007.3.23 | 1              | 640    | 5   |

Здесь год , квартал и площадь относится к определенному времени (год и квартал) и области, для которой X нет.лиц были измерены ( нет_индивидов ).Например, из первого ряда мы получаем, что в первом квартале 2005 года в области 24 у меня было 8 человек, принадлежащих к классу длины ( lenCLs ) 380 мм и возрасту = 3.Стоит отметить, что для конкретной комбинации года, квартала и области у меня могут быть разные классы длины и возраст (таким образом, несколько строк)!

Так что я хочу сделать, в основном, для поднабора необработанного кадра данных дляопределенную комбинацию года, квартала и области, и из этой комбинации вычислите таблицу пропорций, основанную на количестве людей в каждом классе длины.

Пока моя основная функция выглядит следующим образом:

LAK <- function(df,  Year="2005", Quarter="1", Area="22", alkplot=T){
  require(FSA)

  # subset alk by year, quarter and area 
  sALK <- subset(df, year==Year & quarter==Quarter & area==Area)
  dfexp <- sALK[rep(seq(nrow(sALK)), sALK$no_individuals), 1:ncol(sALK)]
  raw <- t(table(dfexp$lenCls, dfexp$age))
  key <- round(prop.table(raw, margin=1), 3)
  return(key)

  if(alkplot==TRUE){
    alkPlot(key,"area",xlab="Age")
  }
}

Из приведенного выше примера набора данных можно заметить, что для year = 2005 & квартал = 3 & area = 21 , у меня нет размеренных людей.Тем не менее, для одной и той же области И года у меня есть данные для 1 или 2 квартала. Наиболее разумным предположением было бы взять подмножественный кадр данных с ближайшего временного шага (четвертый квартал с той же областью и годом).) и замените NA из столбцов « no_individuals », « lenCls » и « age » соответственно.

Обратите внимание, что в некоторых случаях у меня нет данных за определенный год!В приведенном выше примере это можно увидеть, посмотрев на область 24 из 2007 года. В этом случае я не могу заимствовать информацию из ближайшего квартала, и вместо этого мне нужно будет заимствовать информацию из предыдущего года.Это будет означать, что для год = 2007 и площадь = 24 и квартал = 1 я бы позаимствовал информацию из год = 2006 & площадь = 24 и квартал 1 и т. Д. И т. Д.далее.

Я пытался включить это в свою функцию, указав некоторые дополнительные правила, но из-за моих слабых навыков программирования я не добился никакого прогресса.

Итак, любая помощь здесь будет очень оценена.

Вот моя функция LAK, которую я пытаюсь обновить:

LAK <- function(df,  Year="2005", Quarter="1", Area="22", alkplot=T){
      require(FSA)

      # subset alk by year, quarter and area 
      sALK <- subset(df, year==Year & quarter==Quarter & area==Area)

     # In case of empty dataset 
     #if(is.data.frame(sALK) && nrow(sALK)==0){

     if(sALK[rowSums(is.na(sALK)) > 0,]){
     warning("Empty subset combination; data will be subsetted based on the 
     nearest timestep combination") 

     FIXME: INCLDUE IMPUTATION RULES HERE

      }

      dfexp <- sALK[rep(seq(nrow(sALK)), sALK$no_individuals), 1:ncol(sALK)]
      raw <- t(table(dfexp$lenCls, dfexp$age))
      key <- round(prop.table(raw, margin=1), 3)
      return(key)

      if(alkplot==TRUE){
        alkPlot(key,"area",xlab="Age")
      }
    }

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Итак, я наконец-то придумал частичное решение своей проблемы и включу свою функцию здесь на случай, если она может быть кому-то интересна:

LAK <- function(df,  Year="2005", Quarter="1", Area="22",alkplot=T){

  require(FSA)

  # subset alk by year, quarter, area and species
  sALK <- subset(df, year==Year & quarter==Quarter & area==Area)
  print(sALK)

  if(nrow(sALK)==1){
    warning("Empty subset combination; data has been subsetted to the nearest input combination") 
    syear <- unique(as.numeric(as.character(sALK$year)))
    sarea <- unique(as.numeric(as.character(sALK$area)))

    sALK2 <- subset(df, year==syear & area==sarea)
    vals <- as.data.frame(table(sALK2$comb_index))
    colnames(vals)[1] <- "comb_index" 

    idx <- which(vals$Freq>1)
    quarterId <- as.numeric(as.character(vals[idx,"comb_index"]))

    imput <- subset(df,year==syear & area==sarea & comb_index==quarterId)  
    dfexp2 <- imput[rep(seq(nrow(imput)), imput$no_at_length_age), 1:ncol(imput)]
    raw2 <- t(table(dfexp2$lenCls, dfexp2$age))
    key2 <- round(prop.table(raw2, margin=1), 3)
    print(key2)

    if(alkplot==TRUE){
      alkPlot(key2,"area",xlab="Age")
    }

  }  else {
    dfexp <- sALK[rep(seq(nrow(sALK)), sALK$no_at_length_age), 1:ncol(sALK)]
    raw <- t(table(dfexp$lenCls, dfexp$age))
    key <- round(prop.table(raw, margin=1), 3)  
    print(key)

    if(alkplot==TRUE){
      alkPlot(key,"area",xlab="Age")
    }
  }

}

Это решает мою проблему, когда у меня есть данные дляминимум четверть определенной комбинации года и района.Тем не менее, я все еще пытаюсь понять, как поступить, когда у меня нет данных по конкретной комбинации года и района.В этом случае мне нужно позаимствовать данные из ближайшего года, которые содержат данные по всем кварталам одной и той же области.Для приведенного выше примера это будет означать, что для года = 2007 и площади = 24 и квартала = 1 я бы позаимствовал информацию из года = 2006 и площади = 24 и квартала 1 и т. Д. И т. Д.

0 голосов
/ 23 октября 2018

Я не знаю, сталкивались ли вы когда-нибудь с MICE, но это довольно крутой и всеобъемлющий инструмент для вменения переменных.Это также позволяет увидеть, как распределяются вмененные данные, чтобы вы могли выбрать метод, наиболее подходящий для вашей проблемы.Проверьте это краткое объяснение и оригинальное описание пакета

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...