我是R的新手,我正在尝试编写一个添加条目的函数 逐行数据框,并使用
返回数据框以下是我的数据的样本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))
但是当我尝试使用我的功能代码时,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管道连接到rowsum(),如下所示:
f.out <- df.in %>% rowwise() %>%
mutate(name = sum(col.1, col.2, na.rm = TRUE))
但这并不能解决问题。
就命名新列而言,我尝试通过添加名称作为参数来实现,但没有取得任何成功。对此的想法?
任何帮助表示赞赏!
答案 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
。