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

时间:2017-03-14 22:34:44

标签: r function dplyr piping rowwise

我是R的新手,我正在尝试编写一个添加条目的函数 逐行数据框,并使用

返回数据框
  1. 新一行总和的一列
  2. 该列名为。
  3. 以下是我的数据的样本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))
    

    但这并不能解决问题。

    就命名新列而言,我尝试通过添加名称作为参数来实现,但没有取得任何成功。对此的想法?

    任何帮助表示赞赏!

1 个答案:

答案 0 :(得分: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 
}

在实践中,您根本不需要在此处使用rowwise,但在仅选择需要求和的列后,可以使用rowSums