使用ea_spline函数拟合250个土壤剖面数据时出现if判断缺失值错误的技术求助
missing value where TRUE/FALSE needed Error in ea_spline First, let's break down what this error means: the if (nj > mxd) check inside ea_spline is failing because either nj (number of layers in your soil profile) or mxd (maximum depth for spline fitting) is an NA value. This almost always ties back to issues in your input data or how you're calling the function. Here's a step-by-step fix:
1. Check for Missing Values in Your Data
ea_spline can't handle NA values in depth ranges or soil properties—these will break calculations of nj entirely. Run this to spot missing values quickly:
# Replace 'soil_data' with your actual data frame name colSums(is.na(soil_data))
If any columns (especially UDepth, LDepth, or the pred_* fields) have NA entries, you'll need to:
- Remove entire profiles (by
id) that have missing values, or - Impute missing values using profile-specific means/medians, or linear interpolation between adjacent layers.
2. Validate Soil Profile Structure
The function requires valid, multi-layer profiles to fit a spline. Check these edge cases:
a. Profiles with Only One Layer
A single layer can't be fit with a spline—you need at least two points to define the curve. Identify and exclude these:
# Count layers per profile layer_counts <- table(soil_data$id) # Get IDs of profiles with only 1 layer single_layer_profiles <- names(layer_counts)[layer_counts == 1] # Filter them out filtered_data <- soil_data[!soil_data$id %in% single_layer_profiles, ]
b. Invalid Depth Ranges
Make sure no layer has a start depth (UDepth) greater than or equal to its end depth (LDepth):
# Check for invalid depth ranges invalid_depths <- subset(soil_data, UDepth >= LDepth) print(invalid_depths)
Fix these by correcting typos in your data or removing the invalid layers/profiles.
3. Verify Your ea_spline Call
Ensure you're grouping data by id (each profile is processed separately) and passing valid parameters. Here's a correct example of fitting splines for pred_SOC across all valid profiles:
library(GSIF) library(dplyr) spline_results <- filtered_data %>% group_by(id) %>% do({ # Create a continuous depth sequence for the profile # Use the start of each layer and the final end depth depth_seq <- c(.$UDepth, .$LDepth[nrow(.)]) # Extract the soil property values soc_vals <- .$pred_SOC # Fit the spline (adjust mxd to your max desired depth, e.g., 150) spline_fit <- ea_spline(x = depth_seq, y = soc_vals, mxd = 150) # Return the fitted results data.frame( id = .$id[1], fitted_depth = spline_fit$x, fitted_SOC = spline_fit$y ) })
- Double-check that
mxdis set to a numeric value (not NA) matching your maximum profile depth (e.g., 150 in your sample data). - Ensure you're passing valid numeric vectors for
x(depths) andy(soil property) for each profile.
4. Test with a Subset First
To isolate the issue, test ea_spline on the 9 rows of sample data you provided. If this works, the problem is in the larger portion of your data—use the checks above to find the problematic profiles.
内容的提问来源于stack exchange,提问作者Mohammed Zein

