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
相关产品推荐
相关产品推荐

