rowwise() 在函数内不起作用?
rowwise() not working within function?
我是 R 的新手,我正在尝试编写一个函数来添加条目
数据框逐行排列,return 数据框
- 新行总和的一列
- 那个列命名。
这是我的数据样本 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
,在仅选择需要求和的列之后。
我是 R 的新手,我正在尝试编写一个函数来添加条目 数据框逐行排列,return 数据框
- 新行总和的一列
- 那个列命名。
这是我的数据样本 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
,在仅选择需要求和的列之后。