ggplot显示每个值而不是组

时间:2018-09-06 13:10:46

标签: r ggplot2 geom-bar

我有一个非常简单的文本文件,其中is_MI是一个虚拟变量。

is_MI blood_pressure
0     123
0     222
0     111
1     333
1     123

但是,当我尝试通过直方图或箱线图绘制此代码时

ggplot(df_sbp) + geom_bar(mapping = aes(x = is_MI))

它没有两个小节,每个小节分别表示0和1,而是列出了每个单独的数据点,如so

我已经尝试了ggplot的所有组合,但似乎无法解决。我也尝试过factor(is_MI)

这是评论所建议的dput(droplevels(df_sbp[1:20, ]))的输出。

structure(
      list(
        is_MI = structure(
          c(9L, 9L, 7L, 1L, 8L, 17L, 12L, 18L, 5L, 14L, 3L, 11L, 15L, 16L, 4L, 2L, 10L, 6L, 13L, 9L),
          .Label = c("0 89","0 93", "0 95", "0  98", "0 100", "0 105", "0 109",
                     "0 114", "0 116", "0 126", "0 128", "0 129", "0 130",
                     "0 132", "0 136", "0 141", "0 146", "0 157"), 
          class = "factor"),
        blood_pressure = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
                          NA, NA, NA, NA, NA, NA, NA, NA, NA)), 
      row.names = c(NA, 20L), 
    class = "data.frame")

1 个答案:

答案 0 :(得分:0)

您的数据存在问题,代码中的某处是_MI和blood_pressure共同产生的。即取而代之的是两个分开的数字0116,您在"0 116"is_MI中有一个用空格分隔的字符串NAblood_pressure。这就是您正在观察的效果,即。而不是2列,您会看到很多字符串已转换为因数。

请参见下面的代码,其中strplit函数用于从字符串中提取数字。由于您的1仅包含head,因此我故意将几个0包含到数据中。

df <- structure(
  list(
    is_MI = structure(
      c(9L, 9L, 7L, 1L, 8L, 17L, 12L, 18L, 5L, 14L, 3L, 11L, 15L, 16L, 4L, 2L, 10L, 6L, 13L, 9L),
      .Label = c("0 89","0 93", "0 95", "0  98", "0 100", "0 105", "0 109",
                 "0 114", "0 116", "0 126", "0 128", "0 129", "0 130",
                 "0 132", "0 136", "0 141", "0 146", "0 157"), 
      class = "factor"),
    blood_pressure = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
                      NA, NA, NA, NA, NA, NA, NA, NA, NA)), 
  row.names = c(NA, 20L), 
class = "data.frame") 


x <- paste(df$is_MI, sep = " ", collapse = " ")
y <- na.omit(as.numeric(unlist(strsplit(x, " "))))
z <- data.frame(matrix(y, byrow = TRUE, ncol = 2))
names(z) <- c("is_MI", "blood_pressure")
z[1, 1] <- 1
z[14, 1] <- 1

ggplot(z) + geom_bar(mapping = aes(x = is_MI))

输出: graph