#r #dataframe #dplyr
#r #фрейм данных #dplyr
Вопрос:
У меня есть фрейм данных, подобный этому
&ender <- c("m","m","m","m","m","f","f","f","f","f")
a&e <- c(18,28,39,49,3,
13,16,6,19,37)
df <- data.frame(&ender,a&e,strin&sAsFactors = F)
Я пытаюсь создать a&eband
столбец с группами по 5 от 0 до 50.
df %&&t;%
mutate(a&eband = cut( a&e, breaks = seq(0, 50, 5), ri&ht = FALSE)) %&&t;%
&roup_by(&ender, a&eband) %&&t;%
mutate(population = 1) %&&t;%
summarize(population = sum(population, na.rm = TRUE))
Я получаю этот вывод
&ender a&eband population
1 f [5,10) 1
2 f [10,15) 1
3 f [15,20) 2
4 f [35,40) 1
5 m [0,5) 1
6 m [15,20) 1
7 m [25,30) 1
8 m [35,40) 1
9 m [45,50) 1
Это не показывает мне группы с пустыми строками. Я хотел бы заполнить пустые строки значением population = 0.
Мой желаемый результат
&ender a&eband population
1 f [0,5) 0
2 f [5,10) 1
3 f [10,15) 1
4 f [15,20) 2
5 f [20,25) 0
6 f [25,30) 0
7 f [30,35) 0
8 f [35,40) 1
9 f [40,45) 0
10 f [45,50) 0
11 m [0,5) 1
12 m [5,10) 0
13 m [10,15) 0
14 m [15,20) 1
15 m [20,25) 0
16 m [25,30) 1
17 m [30,35) 0
18 m [35,40) 1
19 m [40,45) 0
20 m [45,50) 1
Я пытался сделать это таким образом, но не совсем работает
df %&&t;%
mutate(a&eband = cut( a&e, breaks = seq(0, 50, 5), ri&ht = FALSE)) %&&t;%
&roup_by(&ender, a&eband) %&&t;%
mutate(population = 1) %&&t;%
summarize(population = sum(population, na.rm = TRUE)) %&&t;%
mutate(population = coalesce(population, 0L))
Может ли кто-нибудь указать мне правильное направление?
Ответ №1:
Добавив tidyr
, вы можете сделать:
df %&&t;%
mutate(a&eband = cut(a&e, breaks = seq(0, 50, 5), ri&ht = FALSE)) %&&t;%
count(&ender, a&eband) %&&t;%
complete(a&eband, nestin&(&ender), fill = list(n = 0)) %&&t;%
arran&e(&ender, a&eband)
a&eband &ender n
<fct&&t; <chr&&t; <dbl&&t;
1 [0,5) f 0
2 [5,10) f 1
3 [10,15) f 1
4 [15,20) f 2
5 [20,25) f 0
6 [25,30) f 0
7 [30,35) f 0
8 [35,40) f 1
9 [40,45) f 0
10 [45,50) f 0
11 [0,5) m 1
12 [5,10) m 0
13 [10,15) m 0
14 [15,20) m 1
15 [20,25) m 0
16 [25,30) m 1
17 [30,35) m 0
18 [35,40) m 1
19 [40,45) m 0
20 [45,50) m 1
Ответ №2:
Избегая пакетов, вы можете сделать
df$a&eband <- cut(df$a&e, breaks=seq(0, 50, 5), ri&ht=FALSE)
res <- transform(mer&e(df, expand.&rid(a&eband=levels(df$a&eband),
&ender=unique(df$&ender)), all=TRUE),
population=ave(a&e, &ender, a&eband, FUN=function(x)
sum(!is.na(x))))[-3]
res
# &ender a&eband population
# 1 f [0,5) 0
# 2 f [5,10) 1
# 3 f [10,15) 1
# 4 f [15,20) 2
# 5 f [15,20) 2
# 6 f [20,25) 0
# 7 f [25,30) 0
# 8 f [30,35) 0
# 9 f [35,40) 1
# 10 f [40,45) 0
# 11 f [45,50) 0
# 12 m [0,5) 1
# 13 m [5,10) 0
# 14 m [10,15) 0
# 15 m [15,20) 1
# 16 m [20,25) 0
# 17 m [25,30) 1
# 18 m [30,35) 0
# 19 m [35,40) 1
# 20 m [40,45) 0
# 21 m [45,50) 1