R语言:if-else条件判断及any、all、na.omit使用方法

本文介绍了使用R语言进行条件判断的基本结构与实例,包括如何使用any()、all()函数来检查数据集中的特定条件是否满足,以及如何利用na.omit()函数处理缺失值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本结构展示:

if (7<10) {
  print("Seven is less than ten")
} else{
  print("seven is more than ten")
}


 

实例演示:

Titanic=read.csv("https://goo.gl/4Gqsnz")  #从网络读取数据

1. any()     #any代表只要有任一值符合,即为TRUE

if (any(titanicC$Age>70)) {                                              
  print("there are passengers older than 70")
} else{
  print("no one is older than 70")
}


2. all()   #所有都满足才true

if (all(titanicC$Age>10)) {
  print("all passengers older than 10")
} else{
  print("there are passengers younger than 10")
}


3. na.omit()        #放的位置决定是删除单一变量缺失值,还是删除任何变量缺失值

if (any(na.omit(titanic$Age==100))) {
  print("there are passengers aged 100")
} else{
  print("there are no passengers aged 100")
}                                                                                 #数据库中只要有missing的记录都删掉


if (any(titanic$Age==80, na.rm=TRUE)) {
  print("there are passengers aged 80")
} else{
  print("there are no passengers aged 80")
}                                                                               #Age这个变量有missing的记录删掉,其他变量有missing可以保留



4.  else if 写更重复的语句

x=100
y=10
if(x<y){
  print("AA")
} else if(x==y){
  print(BB)
} else{
  print(CC)
}




# 加载所需包 library(raster) library(ecospat) library(ggplot2) library(dplyr) library(ade4) # ---------- 数据准备 ---------- setwd("C:/Users/86157/Desktop/run") # 设置工作目录 # 读取气候数据(6个生物气候变量) climate_files <- list.files(pattern = "bio.*\\.asc$") climate_stack <- stack(climate_files) # 读取6个物种的分布数据(修正点1:检查列名是否匹配) species_list <- c("BT", "ABT", "CBBT", "MGBT", "XKBT", "XYYM") species_data <- lapply(species_list, function(x){ df <- read.csv(paste0(x, ".csv")) # 确保列名正确(注意大小写) if(all(c("Longitude", "Latitude") %in% colnames(df))){ df %>% dplyr::select(x = Longitude, y = Latitude) %>% na.omit() } else { stop(paste("列名不匹配,请检查", x, "的CSV文件")) } }) # ---------- 数据预处理 ---------- # 提取各物种的环境变量值(修正点2:添加异常处理) env_data <- lapply(species_data, function(sp){ env_values <- extract(climate_stack, sp) # 检查是否所有点都有效 if(any(is.na(env_values))){ warning("存在无效坐标点,已自动过滤NA值") env_values <- na.omit(env_values) } return(env_values) }) # 合并数据并添加物种标签(修正点3:验证数据有效性) combined_data <- do.call(rbind, lapply(1:length(species_list), function(i){ if(nrow(env_data[[i]]) > 0){ data.frame(env_data[[i]], Species = species_list[i]) } else { NULL } })) %>% na.omit() # 检查各物种样本量(重要诊断步骤) print("物种样本量统计:") print(table(combined_data$Species)) # ---------- 生态位重叠分析 ---------- # 主成分分析降维(使用前两个主成分) pca <- dudi.pca(combined_data[,1:6], scannf = FALSE, nf = 2) # 计算所有物种对的重叠矩阵(修正点4:添加有效性检查) overlap_matrix <- matrix(NA, nrow=6, ncol=6, dimnames=list(species_list, species_list)) for(i in 1:6){ for(j in 1:6){ sp1_data <- pca$li[combined_data$Species == species_list[i], ] sp2_data <- pca$li[combined_data$Species == species_list[j], ] # 关键修正:确保数据有效性 if(nrow(sp1_data) >= 5 && nrow(sp2_data) >= 5){ # 至少需要5个样本 overlap_matrix[i,j] <- ecospat.niche.overlap( data.sp = sp1_data, data.env = sp2_data, method = "D" )$D } else { warning(paste(species_list[i], "vs", species_list[j], "样本量不足,跳过计算")) overlap_matrix[i,j] <- NA } } } # ---------- 可视化 ---------- # 绘制生态位密度图(修正点5:添加异常处理) if(nrow(pca$li) > 0){ ecospat.plot.niche(pca, name.axis1 = "PC1 (气候空间维度1)", name.axis2 = "PC2 (气候空间维度2)", col = c("#1b9e77", "#d95f02", "#7570b3", "#e7298a", "#66a61e", "#e6ab02"), species = combined_data$Species) legend("topright", legend = species_list, fill = c("#1b9e77", "#d95f02", "#7570b3", "#e7298a", "#66a61e", "#e6ab02"), cex = 0.7, ncol = 2) } else { warning("PCA结果为空,无法绘制生态位图") } # ---------- 结果输出 ---------- print("生态位重叠矩阵(D指数):") print(round(overlap_matrix, 3)) ggsave("Niche_Overlap_Plot.png", width = 12, height = 10, dpi = 300) write.csv(overlap_matrix, "Niche_Overlap_Matrix.csv", row.names = TRUE)这段代码产生了错误于ecospat.niche.overlap(data.sp = sp1_data, data.env = sp2_data, : 参数没有用(data.sp = sp1_data, data.env = sp2_data, method = "D"),修改它并生成完整代码
03-08
# 加载所需包 library(raster) library(ecospat) library(ggplot2) library(dplyr) library(ade4) # ---------- 数据准备 ---------- setwd("C:/Users/86157/Desktop/run") # 设置工作目录 # 读取气候数据(6个生物气候变量) climate_files <- list.files(pattern = "bio.*\\.asc$") climate_stack <- stack(climate_files) # 读取6个物种的分布数据 species_list <- c("BT", "ABT", "CBBT", "MGBT", "XKBT", "XYYM") species_data <- lapply(species_list, function(x){ read.csv(paste0(x, ".csv")) %>% dplyr::select(x = Longitude, y = Latitude) %>% na.omit() }) # ---------- 数据预处理 ---------- # 提取各物种的环境变量值 env_data <- lapply(species_data, function(sp){ extract(climate_stack, sp) }) # 合并数据并添加物种标签 combined_data <- do.call(rbind, lapply(1:length(species_list), function(i){ data.frame(env_data[[i]], Species = species_list[i]) })) %>% na.omit() # ---------- 生态位重叠分析 ---------- # 主成分分析降维(使用前两个主成分) pca <- dudi.pca(combined_data[,1:6], scannf = FALSE, nf = 2) # 计算所有物种对的重叠矩阵 overlap_matrix <- matrix(NA, nrow=6, ncol=6, dimnames=list(species_list, species_list)) # 双循环计算每对物种的重叠指数(关键修正点) for(i in 1:6){ for(j in 1:6){ sp1 <- pca$li[combined_data$Species == species_list[i],] sp2 <- pca$li[combined_data$Species == species_list[j],] # 修正参数名 index -> method overlap_matrix[i,j] <- ecospat.niche.overlap(sp1, sp2, method = "D")$D } } # ---------- 可视化 ---------- # 绘制生态位密度图 ecospat.plot.niche(pca, name.axis1 = "PC1 (气候空间维度1)", name.axis2 = "PC2 (气候空间维度2)", col = c("#1b9e77", "#d95f02", "#7570b3", "#e7298a", "#66a61e", "#e6ab02"), species = combined_data$Species) legend("topright", legend = species_list, fill = c("#1b9e77", "#d95f02", "#7570b3", "#e7298a", "#66a61e", "#e6ab02"), cex = 0.7, ncol = 2) # ---------- 结果输出 ---------- print("生态位重叠矩阵(D指数):") print(round(overlap_matrix, 3)) ggsave("Niche_Overlap_Plot.png", width = 12, height = 10, dpi = 300) write.csv(overlap_matrix, "Niche_Overlap_Matrix.csv", row.names = TRUE)这段代码产生了错误于array(x, c(length(x), 1L), if (!is.null(names(x))) list(names(x), : 'data'的类型必需为向量,但现在是'NULL',修改并生成完整代码
03-10
修改以下代码的不合理之处并重新给出完整代码:# 加载必要的包 library(geodata) # 访问WorldClim数据 library(raster) # 空间数据处理 library(dismo) # 生物气候因子计算 library(tidyverse) # 数据处理和CSV操作 # 步骤1: 读取站点坐标CSV文件 # 替换为你的实际文件路径 sites <- read_csv("location.csv") %>% dplyr::select(lon, lat) # 确保列名为lon和lat # 步骤2: 下载月度气候数据(1950-2024) # 注意:这会下载大量数据(约3GB),确保网络稳定 monthly_vars <- c("tmin", "tmax", "prec") years <- 1971:2020 # 目标年份范围 # 创建存储月度数据的列表 climate_data <- list() # 设置分辨率(可选值:0.5, 2.5, 5, 10 弧分钟) selected_res <- 10 # 10弧分钟 ≈ 20km分辨率 for (var in monthly_vars) { # 下载1950-2024年完整数据(WorldClim 2.1) message("正在下载: ", var) climate_data[[var]] <- worldclim_global( var = var, res = 10, # 添加分辨率参数 path = tempdir(), version = "2.1" ) } # 步骤3: 提取站点月度数据(1971-2020) extract_monthly <- function(var, year) { # 创建该年份的月份序列(1-12) layers <- (year - 1950) * 12 + 1:12 # 确保图层索引在范围内 layers <- layers[layers <= nlayers(climate_data[[var]])] if (length(layers) > 0) { # 提取站点数据 raster::extract(climate_data[[var]][[layers]], sites) } else { matrix(NA, nrow = nrow(sites), ncol = 12) } } # 初始化存储数组 n_sites <- nrow(sites) monthly_tmin <- array(NA, dim = c(n_sites, 12, length(years))) monthly_tmax <- array(NA, dim = c(n_sites, 12, length(years))) monthly_prec <- array(NA, dim = c(n_sites, 12, length(years))) # 逐年提取数据 for (i in seq_along(years)) { yr <- years[i] message("处理年份: ", yr) monthly_tmin[, , i] <- extract_monthly("tmin", yr) monthly_tmax[, , i] <- extract_monthly("tmax", yr) monthly_prec[, , i] <- extract_monthly("prec", yr) } # 步骤4: 计算生物气候因子 calculate_bioclim <- function(site_id) { # 获取该站点50年数据 site_tmin <- monthly_tmin[site_id, , ] site_tmax <- monthly_tmax[site_id, , ] site_prec <- monthly_prec[site_id, , ] # 计算长期月度均值(1971-2020) tmin_avg <- rowMeans(site_tmin, na.rm = TRUE) tmax_avg <- rowMeans(site_tmax, na.rm = TRUE) prec_avg <- rowMeans(site_prec, na.rm = TRUE) # 计算生物气候因子 bioclim_vars <- biovars( prec = prec_avg, tmin = tmin_avg, tmax = tmax_avg ) return(as.numeric(bioclim_vars)) } # 并行计算所有站点 message("计算生物气候因子...") bioclim_results <- map_dfr(1:n_sites, ~ { data.frame( SiteID = .x, t(as.data.frame(calculate_bioclim(.x))) }, .progress = TRUE) # 设置生物气候因子列名 colnames(bioclim_results)[-1] <- paste0("Bio", 1:19) # 合并坐标信息 final_output <- sites %>% mutate(SiteID = row_number()) %>% left_join(bioclim_results, by = "SiteID") %>% dplyr::select(-SiteID) # 步骤5: 保存结果CSV write_csv(final_output, "bio1971-2020.csv") message("处理完成! 结果已保存至: bio1971-2020.csv")
06-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值