rowwise() 在函数内不起作用?

rowwise() not working within function?

我是 R 的新手,我正在尝试编写一个函数来添加条目 数据框逐行排列,return 数据框

  1. 新行总和的一列
  2. 那个列命名。

这是我的数据样本 df:

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 到 rowsum() 像这样:

f.out <- df.in %>% rowwise() %>%
                 mutate(name = sum(col.1, col.2, na.rm = TRUE))

但这并不能解决问题。

至于命名新列,我尝试通过添加名称作为参数来实现,但没有成功。对此有何想法?

感谢任何帮助!

正如@thelatemail 所言,是评价不规范。 rowwise() ha 与它无关。您需要重写函数才能使用 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 
}

实际上,您根本不需要在这里使用 rowwise,但可以使用 rowSums,在仅选择需要求和的列之后。