r dplyr::case_when 错误:必须是字符向量,而不是双精度向量。

8

我正在尝试使用dplyr :: case_when在dplyr :: mutate中替换一些值:

data<-data%>%
  mutate(floor = case_when(
    floor_id == 2 ~ "ground_floor",
    floor_id == 3 ~ "mezzanine",
    floor_id == 1 ~ "basement",
    floor_id == 30 ~ "over_10",
    floor==1 ~ 1,
    floor==2 ~ 2,
    floor==3 ~ 3,
    floor==4 ~ 4,
    floor==5 ~ 5,
    floor==6 ~ 6,
    floor==7 ~ 7,
    floor==8 ~ 8,
    floor==9 ~ 9,
    floor==10 ~ 10,
    TRUE ~ as.character(floor)))

我遇到了一个错误。

Error: must be a character vector, not a double vector

我有两个问题: 1)有人知道如何更改代码以修复此错误吗? 2)如果没有匹配的情况,将返回NA,这就是为什么我添加了所有这些行,比如floor == 10〜10。有没有办法使代码不那么冗余?

1个回答

15
  1. case_when是类型严格的,这意味着您需要返回相同类型的值。对于前几个情况,您返回像“ground-floor”、“mezzanine”等值,而后面又返回数值1、2,因此出现了错误。如果您将所有返回值更改为字符值,如“1”、“2”等,则可以解决问题。

  2. 由于您只是返回floor值,因此可以通过以下方式简化代码:

library(dplyr)
data<- data%>%
        mutate(floor = case_when(
               floor_id == 2 ~ "ground_floor",
               floor_id == 3 ~ "mezzanine",
               floor_id == 1 ~ "basement",
               floor_id == 30 ~ "over_10",
               TRUE ~ as.character(floor)))

1
提出的解决方案不正确,因为使用此解决方案将用NA值替换从1楼到10楼的所有楼层,因为正如我所写的“如果没有匹配项,则返回NA”。 - kskirpic
1
我重新检查了一下,你的解决方案是有效的,可能是因为上次我没有使用TRUE ~ as.character(floor)这一行代码,所以才会出现NA值。谢谢! - kskirpic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接