rowwise() не работает внутри функции?
Я новичок в R, и я пытаюсь написать функцию, которая будет добавлять записи столбца данных столбец за строкой и возвращать кадр данных с
- столбец нового ряда сумм
- этот столбец назван.
Вот образец моей информации:
Ethnicity <- c('A', 'B', 'H', 'N', 'O', 'W', 'Unknown')
Texas <- c(2,41,56,1,3,89,7)
Tenn <- c(1,9,2,NA,1,32,3)
Когда я непосредственно пробую следующий код, столбцы суммируются по строке:
new_df <- df %>% rowwise() %>%
mutate(TN_TX = sum(Tenn, Texas, na.rm = TRUE))
Но когда я пытаюсь использовать свой код функции, rowwise(), кажется, не работает. Мой код функции:
df.sum.col <- function(df.in, col.1, col.2) {
if(is.data.frame(df.in) != TRUE){ #warning if first arg not df
warning('df.in is not a dataframe')}
if(is.numeric(col.1) != TRUE){
warning('col.1 is not a numeric vector')}
if(is.numeric(col.2) != TRUE){
warning('col.2 is not a numeric vector')} #warning if col not numeric
df.out <- rowwise(df.in) %>%
mutate(name = sum(col.1, col.2, na.rm = TRUE))
df.out
}
bad_df <- df.sum(df,Texas, Tenn)
Это приводит к
,
Я не понимаю, почему ядро функции работает вне ее, а не внутри. Я также попытался передать df.in в rowum() следующим образом:
f.out <- df.in %>% rowwise() %>%
mutate(name = sum(col.1, col.2, na.rm = TRUE))
Но это не решает проблему.
Что касается названия нового столбца, я попытался сделать это, добавив имя в качестве аргумента, но безуспешно. Мысли об этом?
Любая помощь приветствуется!
1 ответ
Как подсказывает @thelatemail, речь идет о нестандартной оценке. rowwise()
не имеет к этому никакого отношения. Вам нужно переписать вашу функцию, чтобы использовать mutate_
, Это может быть сложно понять, но вот одна из версий того, что вы пытаетесь сделать:
library(dplyr)
df <- tibble::tribble(
~Ethnicity, ~Texas, ~Tenn,
"A", 2, 1,
"B", 41, 9,
"H", 56, 2,
"N", 1, NA,
"O", 3, 1,
"W", 89, 32,
"Unknown", 7, 3
)
df.sum.col <- function(df.in, col.1, col.2, name) {
if(is.data.frame(df.in) != TRUE){ #warning if first arg not df
warning('df.in is not a dataframe')}
if(is.numeric(lazyeval::lazy_eval(substitute(col.1), df.in)) != TRUE){
warning('col.1 is not a numeric vector')}
if(is.numeric(lazyeval::lazy_eval(substitute(col.2), df.in)) != TRUE){
warning('col.2 is not a numeric vector')} #warning if col not numeric
dots <- setNames(list(lazyeval::interp(~sum(x, y, na.rm = TRUE),
x = substitute(col.1), y = substitute(col.2))),
name)
df.out <- rowwise(df.in) %>%
mutate_(.dots = dots)
df.out
}
На практике вам вообще не нужно использовать строку, а можно использовать rowSums
После выбора только столбцов нужно суммировать.