如何在R中对向量进行分类以绘制饼图

时间:2019-04-10 13:32:19

标签: r pie-chart

我想将河流数据集分为“小”(<500),“短”(<1500),“中”(<3000)和“长” (> = 3000)。我想绘制一个饼图,以可视化这四个类别的频率。

我尝试过:

 rivers[rivers >= 3000] = 'long'
 rivers[rivers >= 1500 & rivers < 3000] = 'meidum'
 rivers[rivers >= 500 & rivers < 1500]='short'
 rivers[rivers < 500] = 'tiny'

似乎第三条命令对数据没有影响,并且它们与以前相同!

table(rivers)
rivers
   500    505    524    525    529    538    540    545    560    570    600    605 
     2      1      1      2      1      1      1      1      1      1      3      1 
   610    618    620    625    630    652    671    680    696    710    720    730 
     1      1      1      1      1      1      1      1      1      1      2      1 
   735    760    780    800    840    850    870    890    900    906    981   long 
     2      1      1      1      1      1      1      1      2      1      1      1 
meidum   tiny 
    36     62 

我的命令有什么问题,这是为他们绘制饼图的正确方法吗?

3 个答案:

答案 0 :(得分:3)

cut函数并轻松执行此任务:

#random data
rivers<-runif(20, 0, 5000)

#break into desired groups and label
answer<-cut(rivers, breaks=c(0, 500, 1500, 3000, Inf), 
    labels=c("tiny", "short", "medium", "long"), right=FALSE) 

table(answer)
# tiny  short medium   long 
#    1     10      7      2 

答案 1 :(得分:1)

您正在遇到此问题,因为您试图将字符值分配给整数向量。如果改用字符向量,它应该可以工作:

> rivers_size <- as.character(rivers)
> rivers_size[rivers >= 3000] = 'long'
> rivers_size[rivers >= 1500 & rivers < 3000] = 'meidum'
> rivers_size[rivers >= 500 & rivers < 1500]='short'
> rivers_size[rivers < 500] = 'tiny'
> table(rivers_size)
rivers_size
  long meidum  short   tiny 
     1      5     53     82 
> pie(table(rivers_size))

pie chart

或者,可以使用cut(如@ Dave2e所示)完成同一件事:

rivers <- cut(datasets::rivers,
              breaks = c(0, 500, 1500, 3000, Inf), 
              labels = c("tiny", "short", "medium", "long"),
              right = FALSE)
pie(table(rivers))

答案 2 :(得分:1)

这是使用dplyr::case_when的另一种选择。它比使用cut更为冗长,但也更容易概括。

library("tidyverse")

set.seed(1234) # for reproducibility

# `case_when` vectorizes multiple `if-else` statements.
rivers <- sample.int(5000, size = 1000, replace = TRUE)
rivers <- case_when(
  rivers >= 3000 ~ "long",
  rivers >= 1500 ~ "medium",
  rivers >= 500  ~ "short",
  TRUE ~ "tiny"
)
table(rivers)
#> rivers
#>   long medium  short   tiny 
#>    406    303    199     92

reprex package(v0.2.1)于2019-04-10创建