R 如何从数据中创建包含零计数的类列表?
给定一些随机数据,如R 如何从数据中创建包含零计数的类列表?,r,dplyr,R,Dplyr,给定一些随机数据,如x=10.08506,10.32809,,如何高效地创建分类列表?结果(见下面的可复制示例)应如下所示 classes n (10,10.1] 3 (10.1,10.2] 1 (10.2,10.3] 0 (10.3,10.4] 2 (10.4,10.5] 3 (10.5,10.6] 0 (10.6,10.7] 0 (10.7,10.8] 1 下面是一个可重复的示例,它显示了到目前为止最简单的
x=10.08506,10.32809,
,如何高效地创建分类列表?结果(见下面的可复制示例)应如下所示
classes n
(10,10.1] 3
(10.1,10.2] 1
(10.2,10.3] 0
(10.3,10.4] 2
(10.4,10.5] 3
(10.5,10.6] 0
(10.6,10.7] 0
(10.7,10.8] 1
下面是一个可重复的示例,它显示了到目前为止最简单的方法:我可以去掉data.framedf
和full\u join
?也许,我也可以摆脱br,h
library(dplyr)
set.seed(1)
number_of_observations <- 10
nbr <- 10
x <- rnorm(n = number_of_observations, mean = 10.273, sd = 0.3)
br <- seq(from = ceiling(min(nbr*x)-1)/nbr,
to = floor(max(nbr*x)+1)/nbr, by = 1/nbr)
h <- hist(x, breaks = br)
df <- tibble(
classes = h$mids)
df <- df %>%
mutate(classes = cut(classes, breaks = br)) %>%
group_by(classes) %>%
mutate(n = n()) %>%
ungroup() %>%
mutate(freq = n / sum(n)) %>%
arrange(classes)
df2 <- tibble(
classes = x)
df2 <- df2 %>%
mutate(classes = cut(classes, breaks = br)) %>%
group_by(classes) %>%
mutate(n = n()) %>%
ungroup() %>%
mutate(freq = n / sum(n)) %>%
arrange(classes) %>%
distinct()
df <- df %>% full_join(df2, by = "classes")
df$n.y[is.na(df$n.y)] <- 0
result <- df[, c("classes", "n.y")]
colnames(result) <- c("classes", "n")
result
库(dplyr)
种子(1)
观察值的数量%
变异(n=n())%>%
解组()%>%
变异(频率=n/和(n))%>%
排列(类)%>%
不同的()
df%完全联接(df2,by=“classes”)
df$n.y[is.na(df$n.y)]您可以使用seq
、cut
、table
和as.data.frame
,在一行中执行此操作:
setNames(如.data.frame(表(cut(x,seq(10,10.8,0.1))),c(“类”,“n”))
#>类别n
#> 1 (10,10.1] 3
#> 2 (10.1,10.2] 1
#> 3 (10.2,10.3] 0
#> 4 (10.3,10.4] 2
#> 5 (10.4,10.5] 3
#> 6 (10.5,10.6] 0
#> 7 (10.6,10.7] 0
#> 8 (10.7,10.8] 1
通过hist
> list2DF(hist(x,breaks = seq(10, 10.8, 0.1), plot = FALSE))
breaks counts density mids xname equidist
1 10.0 3 3 10.05 x TRUE
2 10.1 1 1 10.15 x TRUE
3 10.2 0 0 10.25 x TRUE
4 10.3 2 2 10.35 x TRUE
5 10.4 3 3 10.45 x TRUE
6 10.5 0 0 10.55 x TRUE
7 10.6 0 0 10.65 x TRUE
8 10.7 1 1 10.75 x TRUE
9 10.8 3 3 10.05 x TRUE
我们可以使用findInterval
setNames(as.data.frame(table(findInterval(x, seq(10, 10.8, 0.1)))), c("classes", "n"))
很好的回答:base-R,一行,通用,清晰!只是出于好奇:你什么时候真的使用/需要dplyr或tidyverse?看起来“几乎所有东西”在base-R中是可能的。@Christoph你几乎可以一直只使用base-R,但是tidyverse使许多常见的数据操作任务变得更容易。我认为它对于数据透视和连接以及交互使用都非常有用。它还经常使代码更具可读性。然而,我经常看到人们在试图获得我想知道这两个,并且不害怕在两者之间切换是关键。我从来没有听说过list2DF
。看起来真的很有用-谢谢!