Звучит так, будто это будет делать то, что вы хотите, но мне нужно это квалифицировать (много). Во-первых, к вашему сведению, я все еще сосредотачиваюсь на NSE в R, но считаю эту виньетку очень полезной.
В связи с решением я попытался ускорить функцию, избегая rowwise()
или apply()
. Это должно быть быстрее с rapply()
/ rowSums()
, но я не тестировал его. Это может привести к проблемам с очень большими данными, потому что rowSums()
преобразует кадр данных в матрицу, но это, вероятно, не будет проблемой. Теоретически, вы также должны иметь возможность использовать выбранные хелперы / имена кавычек без кавычек / позиции столбцов (если вы решитесь).
Кроме того, я нахожу немного странным то, что вам нужно предоставить кадр данных в качестве первого аргумент (то есть, как .
), но может быть способ обойти это. Я, конечно, открыт для любого, кто хочет отредактировать это / использовать это как основу для своего решения. Надеюсь, что это поможет / поможет вам двигаться в правильном направлении!
classify_low_risk_drug <- function(.data, vars, codes, na.rm = FALSE){
df <- rapply(.data, function(x) x %in% codes, how = "replace")
as.integer(rowSums(select(df, !!enquo(vars)), na.rm = na.rm) > 0)
}
as.data.frame(m) %>%
mutate(val4 = classify_low_risk_drug(., vars = vars, codes = c(0, 1, 10)))
V1 V2 V3 val4
1 1 4 7 1
2 2 5 8 0
3 3 6 9 0
РЕДАКТИРОВАТЬ: вы могли бы немного улучшить скорость, избегая преобразования матрицы / используя lapply()
w / pmax()
:
classify_low_risk_drug2 <- function(.data, vars, codes, na.rm = FALSE){
as.integer(do.call(pmax, lapply(select(.data, !!enquo(vars)), `%in%`, codes)))
}