rowwise() не работает внутри функции?

Я новичок в R, и я пытаюсь написать функцию, которая будет добавлять записи столбца данных столбец за строкой и возвращать кадр данных с

  1. столбец нового ряда сумм
  2. этот столбец назван.

Вот образец моей информации:

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))  

new_df

Но когда я пытаюсь использовать свой код функции, 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)

Это приводит к

bad_df

,

Я не понимаю, почему ядро ​​функции работает вне ее, а не внутри. Я также попытался передать 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После выбора только столбцов нужно суммировать.

Другие вопросы по тегам