代码之家  ›  专栏  ›  技术社区  ›  John Thomas

将NA从切割更改为值

  •  0
  • John Thomas  · 技术社区  · 4 年前

    所以我有这样的数据。

    d <- structure(c(NA, 1L, 1L, 4L, NA, NA, NA, 1L, 4L, 1L), .Label = c("[1,8]", 
    "(8,29]", "(29,105]", "(105,738]"), class = "factor")
    
    

    0 然后策划。

    library(ggplot2)
    
    ggplot(data = data.frame(var = d)) +
      geom_bar(aes(x = d), fill = "cornflowerblue")
    

    但是我试着用下面的方法,但它不起作用。。。

    d <- ifelse(is.na(d) == FALSE, "0", d)
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   Darren Tsai    4 年前

    试试这个。

    levels(d) = append(levels(d), 0)
    d[is.na(d)] = 0
    ggplot(data = data.frame(var = d)) + geom_bar(aes(x=d), fill="cornflowerblue")
    
        2
  •  1
  •   dspn    4 年前

    有几个问题:

    is.na(d) == FALSE !is.na(d) 但是既然你想转换NA,你就不想否定它

    第二,你有一些问题,因为因素与其他因素混合在一起。

    你可以通过

    d <- levels(d)[d]
    

    然后可以使用删除NAs

    d <- ifelse(is.na(d), "0", d)
    

    如果你最终可以做一个变量:

    d <- factor(d, ordered = TRUE, levels = c("0", "[1,8]", "(8,29]", "(29,105]", "(105,738]"))
    

        3
  •  1
  •   Darren Tsai    4 年前

    base 解决方案 addNA()

    d <- `levels<-`(addNA(d), c(levels(d), "0"))
    
    #  [1] 0   [1,8]   [1,8]   (105,738]   0   0   0   [1,8]   (105,738]   [1,8]    
    # Levels: [1,8] (8,29] (29,105] (105,738] 0
    

    forcats

    d <- forcats::fct_explicit_na(d, "0")
    
    #  [1] 0   [1,8]   [1,8]   (105,738]   0   0   0   [1,8]   (105,738]   [1,8]    
    # Levels: [1,8] (8,29] (29,105] (105,738] 0
    

    再来一次

    ggplot(data = data.frame(var = d)) +
      geom_bar(aes(x = var), fill = "cornflowerblue")
    

    根据你的评论,你可以 "0"

    ( forcats::fct_relevel() stats::relevel()

    ggplot(data = data.frame(var = relevel(d, "0"))) +
      geom_bar(aes(x = var), fill = "cornflowerblue")