Я имею дело с ситуацией, когда у меня есть несколько различных наборов данных с разными именами столбцов, но функции, которые должны к ним применяться, похожи. Я подумал, чтобы уменьшить дублирование кода, я мог бы создать еще один набор данных имен столбцов и функцию, которая будет применяться к ним:
- необработанные данные (чьи позиции столбцов могут меняться, поэтому мы полагаемся на заголовки столбцов)
- фрейм данных с заголовками столбцов и соответствующей применяемой функцией
### The raw data set
df1 <- tibble(A=c(NA, 1, 2, 3), B = c(1,2,1,NA),
C = c(NA,NA,NA,2), D = c(2,3,NA,1), E = c(NA,NA,NA,1))
# A tibble: 4 x 5
A B C D E
<dbl> <dbl> <dbl> <dbl> <dbl>
1 NA 1 NA 2 NA
2 1 2 NA 3 NA
3 2 1 NA NA NA
4 3 NA 2 1 1
### The dataframe containing functions
funcDf <- tibble(colNames = names(df1), type = c(rep("Compulsory", 4), "Conditional"))
funcDf$func <- c("is.na()", "is.na()", "is.na()", "is.na()",
"ifelse(!is.na(D) & is.na(E), 0, ifelse(!is.na(D) & !is.na(E), 1, 0))")
# A tibble: 5 x 3
colNames type func
<chr> <chr> <chr>
1 A Compulsory is.na()
2 B Compulsory is.na()
3 C Compulsory is.na()
4 D Compulsory is.na()
5 E Conditional ifelse(!is.na(D) & is.na(E), 0, ifelse(!is.na(D) & !is.na(E), 1,~
Я могу запустить простую сумму, например:
df1 %>% summarise_at(.vars = funcDf$colNames, .funs = list(~sum(., na.rm = T)))
Но я не могу применить функции, записанные в кадре данных, к соответствующей переменной.
Любые указания, пожалуйста:)
Редактировать
Я ожидаю, что в результате применения этой функции будет получен следующий вывод:
# A tibble: 1 x 5
A B C D E
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 3 1 2
@ YinYan , большое спасибо за потворство мне, но замой комментарий, что если мне понадобится следующий вывод (с группировкой, как вы можете видеть в моем коде):
df1 %>% group_by(A, B) %>% summarise_all(.funs = list(~sum(., na.rm = T)))
# A tibble: 4 x 5
# Groups: A [4]
A B C D E
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 2 0 3 0
2 2 1 0 0 0
3 3 NA 2 1 1
4 NA 1 0 2 0