我想将河流数据集分为“小”(<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
我的命令有什么问题,这是为他们绘制饼图的正确方法吗?
答案 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))
或者,可以使用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创建