Исключить значения NULL из запроса SQL и сохранить старые значения в кадре данных - PullRequest
0 голосов
/ 12 февраля 2019

Я хотел бы динамически выполнять SQL-запрос (например, каждый день) и сохранять данные в реактивном фрейме данных в приложении Shiny.Однако, если возвращаемый запрос содержит значения NULL или нули, я хотел бы сохранить старые значения вместо того, чтобы заменить их последним запрашиваемым NULL или 0.

Например:

Исходный фрейм данных:

date       a b c d
2019-01-01 1 2 3 4
2019-01-02 2 3 4 5

Возвращенный запрос, сохраненный как фрейм данных:

date       a    b c d
2019-01-03 NA 4 3 0

После того, как SQL-запрос возвращается и связываетсяв кадре данных с использованием dplyr bind_rows, итоговый кадр данных должен выглядеть следующим образом:

date       a b c d
2019-01-01 1 2 3 4
2019-01-02 2 3 4 5
2019-01-03 2 4 3 5   # 2 retained instead of NULL, 5 retained instead of 0

Я понимаю, что, вероятно, мне нужно написать условный оператор, подобный следующему псевдокоду:

if (is.null(returned_query) & (returned_query != 0)) {
   // some code to replace value with the most recent value
} else {
  // proceed with bind_rows()
} 

К сожалению, я не могу контролировать запросы SQL, и я должен сделать это в R. У кого-нибудь есть решение этой проблемы?

1 Ответ

0 голосов
/ 12 февраля 2019

Вы можете использовать «который», чтобы определить индексы для желаемых критериев NULL / NA / 0.

Вы можете узнать больше о том, какие

Итак, для вашего вопроса, aрешение может быть:

Настройка тестовых данных


DT_old <- data.frame(date=c("2019-01-01","2019-01-02"),a=1:2,b=2:3,c=3:4,d=4:5, stringsAsFactors = FALSE)

# New Data from SQL query

DT_new <- data.frame(date="2019-01-03",a=0,b=2,c=3,d=4, stringsAsFactors = FALSE)

Привязать новые данные к старым

DT3 <- rbind(DT_old, DT_new) # or use your dplyr logic to row bind old and new datasets

Рассчитать индексы для ваших критериев и заменить предыдущей строкой в ​​привязкенабор данных

# find out indices of the bound dataframe which meet your criteria
n_idx <- which((DT3 ==0)|is.na(DT3)|is.null(DT3), arr.ind=TRUE)

# substitute said indices with values from previous row

DT3[nrow(DT3),n_idx[,2]] <- DT3[nrow(DT3)-1,n_idx[,2]]


Обратите внимание, что предполагается, что из каждого запроса добавляется только одна строка.

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