我想动态执行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
使用 dplyr bind_rows返回 SQL 查询并将其绑定到数据帧后,最终数据帧应如下所示:
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中执行此操作。
您可以使用"which"来标识所需条件 NULL/NA/0 的索引。
您可以在 ?哪个
因此,对于您的问题,解决方案可能是:
设置测试数据
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
计算条件的索引,并在绑定数据集中使用 prev 行替换
# 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]]
请注意,这假设每个查询只添加一行。