Во-первых, в вашем коде есть пара общих проблем кодирования / синтаксиса.
- Я бы не советовал смешивать синтаксис
dplyr
и data.table
.
- Вам не нужно
$
индексировать столбцы внутри dplyr
глаголов.
Я бы порекомендовал ознакомиться с одним из многих свободно доступных tidyverse
учебных пособий, чтобы изучить основы преобразования / манипулирования данными с помощью dplyr
/ tidyr
.
Кроме того, следующий код воспроизводит ваш ожидаемый результат
calc_index <- function(x) sum(x != 0) / length(x) * 100
library(dplyr)
df %>%
group_by(borough) %>%
summarise(
albo_HI = calc_index(albo),
aegyp_HI = calc_index(aegyp),
Total_albo_aegyp = calc_index(Total_albo_aegyp))
## A tibble: 4 x 4
# borough albo_HI aegyp_HI Total_albo_aegyp
# <fct> <dbl> <dbl> <dbl>
#1 a1 75 75 75
#2 a2 33.3 66.7 66.7
#3 a3 100 100 100
#4 a4 66.7 66.7 100
Или вы можете использовать summarise_all
df %>%
group_by(borough) %>%
select(-neighborhood, -concession) %>%
summarise_all(~calc_index(.x))
## A tibble: 4 x 4
# borough albo aegyp Total_albo_aegyp
# <fct> <dbl> <dbl> <dbl>
#1 a1 75 75 75
#2 a2 33.3 66.7 66.7
#3 a3 100 100 100
#4 a4 66.7 66.7 100