Я хочу знать, есть ли лучший способ сделать то, что я делаю.
У меня есть кусок (образец здесь):
library(tidyverse)
library(Hmisc) # for the weighted values
df2 <- structure(list(Q31_A_1 = c(9L, 3L, 2L, 2L, 2L, 3L, 5L, 3L, 1L,
3L, 4L, 4L, 1L, 3L, 9L, 2L, 4L, 2L, 3L, 2L, 9L, 2L, 4L, 3L, 3L,
3L, 9L, 2L, 3L, NA), Q31_A_2 = c(9L, 4L, 2L, 2L, 2L, 3L, 4L,
3L, 1L, 3L, 5L, 4L, 1L, 3L, 9L, 2L, 3L, 2L, 3L, 9L, 9L, 2L, 4L,
3L, 3L, 3L, 4L, 2L, 3L, NA), Q31_A_3 = c(9L, 4L, 2L, 2L, 2L,
3L, NA, 3L, 1L, 3L, NA, 4L, 1L, 2L, 9L, 2L, 3L, 2L, 2L, 2L, 9L,
2L, 4L, 3L, 3L, 2L, 3L, 2L, 2L, 2L), Q31_A_4 = c(9L, 3L, 2L,
2L, NA, 3L, 4L, 3L, 3L, 3L, 5L, 4L, 3L, 3L, 4L, NA, 4L, 2L, 3L,
9L, 9L, 2L, 4L, 3L, 4L, 4L, 9L, 2L, 3L, 2L), Q31_B_1 = c(9L,
2L, 2L, 2L, 1L, 2L, 9L, 3L, NA, 3L, 4L, 4L, 2L, 9L, 9L, NA, 9L,
2L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 4L), Q31_B_2 = c(9L,
9L, 9L, 2L, 1L, 2L, 9L, 3L, 1L, 3L, 4L, 9L, 2L, 9L, 9L, 2L, 9L,
2L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 4L), Q31_B_3 = c(9L,
9L, 9L, 2L, 1L, 2L, 9L, 3L, NA, 3L, 4L, 9L, 1L, 9L, 9L, NA, 9L,
9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 3L), ages = c("50-64 years",
"35-49 years", "35-49 years", "50-64 years", "65+ years", "65+ years",
"65+ years", "65+ years", "65+ years", "65+ years", "65+ years",
"35-49 years", "65+ years", "50-64 years", "65+ years", "65+ years",
"50-64 years", "35-49 years", "65+ years", "65+ years", "65+ years",
"65+ years", "65+ years", "50-64 years", "50-64 years", "50-64 years",
"50-64 years", "65+ years", "50-64 years", "35-49 years"), wt = c(0.64708755364565,
0.921064359620811, 1.3907697993331, 0.974726729781105, 0.576703486333466,
0.489053964840285, 0.489053964840285, 0.576703486333466, 0.576703486333466,
0.489053964840285, 0.489053964840285, 0.921064359620811, 0.489053964840285,
0.974726729781105, 0.489053964840285, 0.489053964840285, 0.64708755364565,
0.921064359620811, 0.489053964840285, 0.489053964840285, 0.576703486333466,
0.489053964840285, 0.576703486333466, 0.974726729781105, 0.64708755364565,
0.974726729781105, 0.974726729781105, 0.489053964840285, 0.974726729781105,
0.921064359620811)), row.names = c(NA, -30L), class = c("tbl_df",
"tbl", "data.frame"))
Что это:
# A tibble: 30 x 9
Q31_A_1 Q31_A_2 Q31_A_3 Q31_A_4 Q31_B_1 Q31_B_2 Q31_B_3 ages wt
<int> <int> <int> <int> <int> <int> <int> <chr> <dbl>
1 9 9 9 9 9 9 9 50-64 years 0.647
2 3 4 4 3 2 9 9 35-49 years 0.921
3 2 2 2 2 2 9 9 35-49 years 1.39
4 2 2 2 2 2 2 2 50-64 years 0.975
5 2 2 2 NA 1 1 1 65+ years 0.577
6 3 3 3 3 2 2 2 65+ years 0.489
7 5 4 NA 4 9 9 9 65+ years 0.489
8 3 3 3 3 3 3 3 65+ years 0.577
9 1 1 1 3 NA 1 NA 65+ years 0.577
10 3 3 3 3 3 3 3 65+ years 0.489
# ... with 20 more rows
И я хочу применить функцию к столбцам с Q31_A_1 по Q31_B_3 (в полном наборе данных гораздо больше столбцов и строк).Это данные опроса.Я хочу присоединить значения к значению индекса:
index5 <- tibble(
int = 1:5,
factor = c(100, 75, 50, 25, 0))
Это делается в функции:
group_scores2 <- function(field) {
field <- enquo(field)
df <- df2 %>% select(!!field, ages, wt) %>%
filter(UQ(field) <=5) %>%
mutate(int = as.integer(!!field))
df
df <- left_join(df,index5, by = "int",
copy=FALSE)
df
ov <- df %>% summarise(mean = wtd.mean(factor, wt), var = wtd.var(factor, wt), sd = sqrt(var), count = sum(wt)) %>%
mutate(cat = "Overall") %>%
mutate(group = "Overall (2018)")
ag <- df %>%
group_by(ages) %>%
summarise(mean = wtd.mean(factor, wt), var = wtd.var(factor, wt), sd = sqrt(var), count = sum(wt)) %>%
mutate(cat = "Age Group") %>%
rename(group = ages)
combined <- bind_rows(ov, ag)
}
Что, например, когда я запускаю это: group_scores2(Q31_A_1)
Это вывод.
# A tibble: 4 x 6
mean var sd count cat group
<dbl> <dbl> <dbl> <dbl> <chr> <chr>
1 56.2 514. 22.7 17.5 Overall Overall (2018)
2 58.4 548. 23.4 4.15 Age Group 35-49 years
3 51.3 194. 13.9 6.17 Age Group 50-64 years
4 59.1 894. 29.9 7.20 Age Group 65+ years
Я пытался использовать purrr
и семейство функций apply
, но не могу понять, что это правильно.Например:
df3 <- df2 %>% gather(ind, value, Q31_A_1:Q31_B_3)
df3 %>% map(group_scores2)
, который возвращает ошибку.
Я не знаю, с чего начать apply
.
Я хотел бы знать, есть ли более эффективный способ сделать это.