0

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

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

新的_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)

这导致

坏_df

.

我不明白为什么函数的核心在它之外起作用,而不在内部起作用。我还尝试将 df.in 传递到 rowsum() ,如下所示:

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

但这并不能解决问题。

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

任何帮助表示赞赏!

4

1 回答 1

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在仅选择需要求和的列之后使用 , 。

于 2017-03-15T00:41:52.077 回答