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

问题描述 投票:0回答:3

我想将河流数据集分类为“微小”(<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 

我的命令出了什么问题,是否为它们绘制饼图的正确方法是什么?

r pie-chart
3个回答
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
投票

您遇到此问题,因为您正在尝试将字符值分配给整数向量。如果你使用角色向量,它应该工作:

> 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))

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创建于2019-04-10(v0.2.1)

© www.soinside.com 2019 - 2024. All rights reserved.