Я пытаюсь применить подход на основе тидиверса или, по крайней мере, аккуратное решение, для применения пользовательских функций над уровнями фактора в кадре данных.
Рассмотрим следующий тестовый набор данных:
df <- tibble(LINE=rep(c(1,2),each=6), FOUND=c(1,1,1,0,1,1,0,0,1,0,0,1))
# LINE FOUND
# <dbl> <dbl>
# 1 1 1
# 2 1 1
# 3 1 1
# 4 1 0
# 5 1 1
# 6 1 1
# 7 2 0
# 8 2 0
# 9 2 1
#10 2 0
#11 2 0
#12 2 1
Я хочу знать, например, долю найденных результатов (например, FOUND == 1) по уровню фактора LINE. Прямо сейчас я работаю со следующим кодом, но я действительно пытаюсь найти что-то более чистое.
# This is the function to calculate the proportion "found"
get_prop <- function (data) {
tot <- data %>% nrow()
found <- data %>% dplyr::filter(FOUND==1) %>% nrow
found / tot
}
# This is the code to generate the expected result
lines <- df$LINE %>% unique %>% sort
v_line <- vector()
v_prop <- vector()
for (i in 1:length(lines)) {
tot <- df %>% dplyr::filter(LINE==lines[i])
v_line[i] <- lines[i]
v_prop[i] <- get_prop(tot)
}
df_line = data.frame(LINE = v_line, CALL = v_prop)
Я ожидал бы, что следующее будет работать, но это не так, так как он возвращает результат для каждого уровня, но численное решение - это решение для всего набора данных, а не для конкретных уровней c:
df %>% dplyr::group_by(LINE) %>% dplyr::summarise(get_prop(.))
РЕДАКТИРОВАТЬ : Обратите внимание, что я ищу является решением для применения пользовательской функции над уровнями фактора в кадре данных. Это не обязательно число или доля вхождений определенного значения, как показано в примере.
РЕДАКТИРОВАТЬ 2 : То есть я ищу решение, которое использует функции get_prop
выше. Это не потому, что это лучший способ решения этой конкретной проблемы, а потому, что она более обобщаема