您可以在循环中使用if/if-else/else:
library(classInt)
data <- data.frame(
country = c('Australia', 'Italy', 'Peru', 'China','Australia', 'Italy', 'Peru', 'China','Australia', 'Italy', 'Peru', 'China','Nigeria','Australia', 'Italy', 'Peru', 'China'),
time = c(21, 18, 17, 10, 10, 15, 27, 0, 2, 4, 5, 7, 4, 8, 9, 10, 5),
area = c("A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C", "D", "D", "D", "D", "D")
)
split_data <- split(data, data$country)
result <- list()
for (i in 1:length(split_data)) {
split <- split_data[[i]]
if(nrow(split) == 1) {
# add a made up lower level less than the given time
# so that the given time is the second level
levels <- c(-1, split$time)
labels <- sprintf("[%s]", levels)
split$range_abs = factor(split$time, levels, labels)
split$class_abs = as.numeric(split$range_abs)
} else if(nrow(split) == 2) {
levels <- sort(split$time)
labels <- sprintf("[%s]", levels)
split$range_abs = factor(split$time, levels, labels)
split$class_abs = as.numeric(split$range_abs)
} else {
skip_to_next <- FALSE
tryCatch(
Classes <- classIntervals(
split$time,
n = 5,
cutlabels = FALSE,
style = 'fisher',
factor = FALSE,
warnSmallN = FALSE,
warnLargeN = FALSE
),
error = function(e) {
skip_to_next <<- TRUE
}
)
if(skip_to_next) { next }
split$range_abs <- classify_intervals(split$time, 3, "fisher", factor = TRUE)
split$class_abs <- classify_intervals(split$time, 3, "fisher", factor = FALSE)
}
result[[i]] <- split
}
result
#> [[1]]
#> country time area range_abs class_abs
#> 1 Australia 21 A [15.5,21] 3
#> 5 Australia 10 B [5,15.5) 2
#> 9 Australia 2 C [2,5) 1
#> 14 Australia 8 D [5,15.5) 2
#>
#> [[2]]
#> country time area range_abs class_abs
#> 4 China 10 A [8.5,10] 3
#> 8 China 0 B [0,2.5) 1
#> 12 China 7 C [2.5,8.5) 2
#> 17 China 5 D [2.5,8.5) 2
#>
#> [[3]]
#> country time area range_abs class_abs
#> 2 Italy 18 A [12,18] 3
#> 6 Italy 15 B [12,18] 3
#> 10 Italy 4 C [4,6.5) 1
#> 15 Italy 9 D [6.5,12) 2
#>
#> [[4]]
#> country time area range_abs class_abs
#> 13 Nigeria 4 D [4] 2
#>
#> [[5]]
#> country time area range_abs class_abs
#> 3 Peru 17 A [13.5,22) 2
#> 7 Peru 27 B [22,27] 3
#> 11 Peru 5 C [5,13.5) 1
#> 16 Peru 10 D [5,13.5) 1
创建于2024-07-03
reprex v2.1.0.9000
Reprex文件托管于
在…上
GitHub