Как классифицировать вектор в R, чтобы нарисовать круговую диаграмму - PullRequest
0 голосов
/ 10 апреля 2019

Я хочу разделить набор данных по рекам на «крошечные» (<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 ]

3 голосов
/ 10 апреля 2019

Функция 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 голос
/ 10 апреля 2019

Вот еще один вариант использования 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

Создано в 2019-04-10 пакетом Представить (v0.2.1)

1 голос
/ 10 апреля 2019

Вы столкнулись с этой проблемой, потому что вы пытаетесь присвоить символьные значения целочисленному вектору.Если вместо этого вы работаете с символьным вектором, он должен работать:

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