如何用R语言if语句在filter无匹配数据时返回NULL?
修改find_time函数以在无匹配数据时返回NULL
我明白你的需求了——当没有满足OD > threshold_1的数据时,你希望函数返回NULL而不是空数据框。咱们可以在原函数里加一个简单的判断逻辑来实现这个功能,同时也可以把一些旧的dplyr语法换成更现代的写法:
library(dplyr) find_time = function(df, threshold_1, threshold_2, ODf){ return_value_1 = df %>% arrange(time) %>% filter(OD > threshold_1) %>% slice(1) # 替换旧的slice_为slice,符合当前dplyr版本的语法 # 判断是否没有匹配到数据 if(nrow(return_value_1) == 0){ return(NULL) } # 有数据时修改列名并返回 colnames(return_value_1)[1] <- "time_hdt_upper" colnames(return_value_1)[2] <- "OD_hdt_upper" return(data.frame(return_value_1)) }
关键修改点说明:
- 用
nrow(return_value_1) == 0检查过滤后的结果是否为空:如果过滤后没有行数据,直接返回NULL - 把
slice_(1)替换为slice(1):slice_是dplyr的旧版语法,现在官方推荐使用slice()这类标准函数 - 只有当有匹配数据时,才会执行列名修改和数据框返回的逻辑
测试示例:
假设你有一个空匹配的情况:
# 创建一个OD都小于threshold_1的测试数据框 test_df <- data.frame(time = c(1,2,3), OD = c(0.5, 0.6, 0.7)) result <- find_time(test_df, threshold_1 = 1, threshold_2 = NULL, ODf = NULL) print(result) # 输出:NULL
当有匹配数据时,函数会正常返回修改列名后的结果:
test_df2 <- data.frame(time = c(1,2,3), OD = c(0.5, 1.2, 0.7)) result2 <- find_time(test_df2, threshold_1 = 1, threshold_2 = NULL, ODf = NULL) print(result2) # time_hdt_upper OD_hdt_upper # 1 2 1.2
内容的提问来源于stack exchange,提问作者amir.fathi
相关产品推荐
相关产品推荐

