Создать столбец из данных о динамическом количестве столбцов в зависимости от доступности в R - PullRequest
0 голосов
/ 18 октября 2019

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

Воспроизводимые данные:

  set.seed(123)
  actuals = runif(10, 500, 1000)
  get_rand_vector <- function(){return (runif(10, 0.95, 1.05))}
  get_na_rand_ixs <- function(){return (round(runif(5,0,10),0))}
  df = data.frame("source_1" = actuals*get_rand_vector(),
                  "source_2" = actuals*get_rand_vector(),
                  "source_n" = actuals*get_rand_vector())
  df[["source_1"]][get_na_rand_ixs()] <- NA
  df[["source_2"]][get_na_rand_ixs()] <- NA
  df[["source_n"]][get_na_rand_ixs()] <- NA

Мое ручное решение выглядит следующим образом:

  df$available <- ifelse(
    !is.na(df$source_1),
    df$source_1,
    ifelse(
      !is.na(df$source_2),
      df$source_2,
      df$source_n
    )
  )

При желаемом результате:

   source_1 source_2 source_n available
1        NA       NA       NA        NA
2        NA       NA 930.1242  930.1242
3  716.9981       NA 717.9234  716.9981
4        NA 988.0446       NA  988.0446
5  931.7081       NA 924.1101  931.7081
6  543.6802 533.6798       NA  543.6802
7  744.6525 767.4196 783.8004  744.6525
8  902.8788 955.1173       NA  902.8788
9  762.3690       NA 761.6135  762.3690
10 761.4092 702.6064 708.7615  761.4092

Как я могу автоматически перебирать доступные источники, чтобы установить данныебыть рассмотренным? В некоторых случаях n_sources может быть 1,2,3 .., 7, а приоритет следует естественному порядку (1> 2> ..)

Ответы [ 2 ]

1 голос
/ 18 октября 2019

coalesce() из dplyr предназначен для этого:

library(dplyr)

df %>%
  mutate(available = coalesce(!!!.))

   source_1 source_2 source_n available
1        NA       NA       NA        NA
2        NA       NA 930.1242  930.1242
3  716.9981       NA 717.9234  716.9981
4        NA 988.0446       NA  988.0446
5  931.7081       NA 924.1101  931.7081
6  543.6802 533.6798       NA  543.6802
7  744.6525 767.4196 783.8004  744.6525
8  902.8788 955.1173       NA  902.8788
9  762.3690       NA 761.6135  762.3690
10 761.4092 702.6064 708.7615  761.4092
1 голос
/ 18 октября 2019

Когда у вас есть все векторы-кандидаты в порядке и в соответствующей структуре данных (например, data.frame или matrix), вы можете использовать apply, чтобы применить функцию к строкам. В этом случае мы просто ищем первое не NA значение. Таким образом, после первого блока кода, приведенного выше, вам нужна только следующая строка:

df$available <- apply(df, 1, FUN = function(x) x[which(!is.na(x))[1]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...