Условно назначьте значения NA в столбце на основе сравнения нескольких наблюдений в другом столбце в пределах сгруппированного фрейма данных. - PullRequest
0 голосов
/ 30 ноября 2018

Ниже приведен пример фрейма данных (код и выходные данные), который включает соответствующие столбцы из моего фактического фрейма данных:

example <- data.frame(contig=c("Contig1", "Contig1", "Contig1", "Contig1", "Contig1", "Contig2", "Contig2", "Contig2", "Contig2", "Contig2", "Contig2", "Contig2", "Contig3", "Contig3", "Contig3", "Contig3", "Contig3", "Contig3", "Contig3", "Contig3"),
                  pos=c(500, 650, 750, 1000, 2000, 500, 4100, 5000, 5300, 6100, 6400, 7500, 600, 3800, 4500, 5000, 5500, 6100, 7000, 8000),
                  av=c(NA, 12, NA, NA, NA, NA, NA, 20, NA, NA, 25, NA, NA, 55, NA, NA, NA, 56, NA, NA))

example data frame

В настоящее время только некоторые наблюдения имеют значение для av, тогда как многие NA.Я хотел бы присвоить значения av для замены NA s, и у меня есть два разных, отдельных метода, которые я хотел бы использовать для этого, чтобы я мог сравнить результаты этих двух методов позже, но яне знаю, как реализовать любой метод.

Во-первых, я хотел бы заменить NA s таким, чтобы в contig (т. Е. Кадр данных должен быть сгруппирован по contig), если pos наблюдения с NA для av находится в пределах 1000 от pos наблюдения со значением av, тогда NA будет заменено на это значение av.Любые NA с без pos в пределах 1000 от другого pos (со значением av) на том же contig останутся как NA.

Во-вторых, я хотел бы заменить NA s без условия, когда pos находится в пределах 1000 от pos значением av, но все еще в группах contig.Многие группы contig будут иметь только одно наблюдение со значением av, поэтому это значение av может заменить все NA в пределах этой группы contig (я думаю, что na.locf() сделает это).Однако в некоторых contig группах имеется более одного наблюдения со значением av, поэтому для тех, кому я бы хотел присвоить NA s, значение av наблюдения с pos ближе к его собственному pos значение.

Ниже приведены желаемые результаты двух методов для примера кадра данных.

Метод 1

method1 output

Метод 2

method2 output

1 Ответ

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

Просто вставьте фрейм данных для вменения.Измените аргумент метода на «method1» или «method2».Если структура данных отличается от структуры, она не будет работать, поскольку у меня есть ссылки на столбцы по их индексу, например, 1 для contig, 2 для pos и 3 для av.

impute_av = function(df, method){

  sapply(1:nrow(df), function(i){

    if(is.na(df[i,3])){

      if(method == "method1"){
        y = df[df[,1] == df[i,1] & df[,2] < df[i,2] + 1000 & df[,2] > df[i,2] - 1000, 2:3, drop=F]
      } else if(method == "method2"){
        y = df[df[,1] == df[i,1], 2:3, drop=F]
      }

      y = y[!is.na(y[,2]),,drop=F]

      if(nrow(y) == 0){
        df[i,3]
      } else {
        y[which.min(abs(y[,1] - df[i,2])), 2]
      }

    } else df[i,3]

  })

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