You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言中使用case_when计算class字段报错,求解决方法

使用dplyr::case_when计算class字段时报错

问题详情

我在R语言中尝试用dplyr的case_when函数计算class字段时遇到报错,以下是相关信息:

数据集dput输出

temp <- structure(list(X = c("CZL", "CZL", "CZL", "CZL", "CZL", "FNR"
), database.code = c("CZL.BB", "CZL.CA", "CZL.EU", "CZL.RN",
"CZL.SL", "FNR.10_10"), tmt.plot.id = c("Picea", "long-lived",
"Picea", "long-lived", "Fagus", "long-lived"), dom.species = c("abies",
"broadleaves", "abies", "broadleaves", "sylvatica", "broadleaves"
), shr.of.ba = c(57.88029, 70.35056, 100, 85.16742, 65.68771,
11.24247), gini.total = c(0.678242, 0.6553011, 0, 0.6493601,
0.6144469, 0.4811145), gini.ctgr.total = c(2L, 2L, 1L, 2L, 2L,
1L), gini.dom = c(0.5821508, 0.5511097, 0.5555176, 0.6287997,
0.6425109, 0.2670409), gini.ctgr.dom = c(2L, 2L, 2L, 2L, 2L,
1L), species = c("multiple", "multiple", "single", "single",
"multiple", "multiple"), latitude = c(48.97861, 48.65528, 50.06833,
48.67861, 49.40194, 46.13386), longitude = c(13.8119444, 16.9422222,
17.2622222, 16.9488889, 18.4213889, -0.4346595)), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6"))

数据集展示

X database.code tmt.plot.id            dom.species shr.of.ba gini.total gini.ctgr.total
1 1           CZL      CZL.BB            Picea abies  57.88029  0.6782420               2
2 2           CZL      CZL.CA long-lived broadleaves  70.35056  0.6553011               2
3 3           CZL      CZL.EU            Picea abies 100.00000  0.0000000               1
4 4           CZL      CZL.RN long-lived broadleaves  85.16742  0.6493601               2
5 5           CZL      CZL.SL        Fagus sylvatica  65.68771  0.6144469               2
6 6           FNR   FNR.10_10 long-lived broadleaves  11.24247  0.4811145               1
   gini.dom gini.ctgr.dom  species latitude  longitude
1 0.5821508             2 multiple 48.97861 13.8119444
2 0.5511097             2 multiple 48.65528 16.9422222
3 0.5555176             2   single 50.06833 17.2622222
4 0.6287997             2   single 48.67861 16.9488889
5 0.6425109             2 multiple 49.40194 18.4213889
6 0.2670409             1 multiple 46.13386 -0.4346595

执行代码

temp <- temp %>% mutate(class = dplyr::case_when(gini.total >= 0.5 & gini.dom >= 0.5 & species == "single" ~ "single species irregular",
                                    gini.total >= 0.5 & gini.dom < 0.5 & species == "single" ~ "single species admixture",
                                    gini.total >= 0.5 & gini.dom >= 0.5 & species == "multiple" ~ "multiple species irregular",
                                    gini.total >= 0.5 & gini.dom < 0.5 & species == "multiple" ~ "multiple species layered",
                                    gini.total < 0.5  & species == "single" ~ "single species regular",
                                    gini.total < 0.5  & species == "multiple" ~ "multiple species regular", TRUE ~ NA_real_))

报错信息

Error in `mutate()`:
! Problem while computing `class = dplyr::case_when(...)`.
Caused by error in `dplyr::case_when

错误原因与修正方案

核心错误

case_when要求所有分支的返回值类型必须统一:

  • 前面6个条件分支返回的都是字符串类型的分类标签
  • 最后默认分支TRUE ~ NA_real_返回的是数值型NA,类型不匹配导致报错

修正后的代码

把默认分支的NA_real_改为字符型NA(NA_character_),或者直接写NA(在字符串上下文会自动识别为字符型):

temp <- temp %>% 
  mutate(class = dplyr::case_when(
    gini.total >= 0.5 & gini.dom >= 0.5 & species == "single" ~ "single species irregular",
    gini.total >= 0.5 & gini.dom < 0.5 & species == "single" ~ "single species admixture",
    gini.total >= 0.5 & gini.dom >= 0.5 & species == "multiple" ~ "multiple species irregular",
    gini.total >= 0.5 & gini.dom < 0.5 & species == "multiple" ~ "multiple species layered",
    gini.total < 0.5 & species == "single" ~ "single species regular",
    gini.total < 0.5 & species == "multiple" ~ "multiple species regular",
    TRUE ~ NA_character_  # 这里改为字符型NA
  ))

运行结果

执行修正代码后,temp$class的结果如下:

[1] "multiple species irregular" "multiple species irregular" "single species regular"    
[4] "single species irregular"   "multiple species irregular" "multiple species regular"  

内容的提问来源于stack exchange,提问作者starski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:46:17