通过 R 中的函数改变数据框

Mutate data frame via function in R

抱歉这个基本问题,但我在这个论坛找不到解决这个问题的例子。我试过了 this one and this one.

我想通过 R 和 tidyverse 中的函数在我的 data.frame 中更改/创建一个新变量

示例:

crivo <- function(x) {
  x <<- x %>% 
    mutate(resp_1 = if_else(MEMO_RE01 == 0,"VN","FP")) %>% 
    mutate(resp_2 = if_else(MEMO_RE02 == 1,"VP","FN"))
  }
crivo(memo_re)

我的 data.frame 名称是 "memo_re",但我也会将此函数用于其他数据集,只需更改 x 参数。 R 正在创建一个名为 x 的新 data.frame,而不是在 "memor_re"(原始数据集)中创建一个新变量。换句话说,我想分配一个函数来做到这一点:

memo_re <- memo_re %>% mutate(resp_1 = if_else(MEMO_RE01 == 0,"VN","FP"))

但我需要更改许多数据集,因此,我希望能够指定要更改的数据集。

可重现的代码

library(tidyverse)
memo_re <- data.frame(MEMO_RE01=rep(c(0,1),100), MEMO_RE02=c(0,1))

crivo <- function(x) {
  x <<- x %>% 
    mutate(resp_1 = if_else(MEMO_RE01 == 0,"VN","FP")) %>% 
    mutate(resp_2 = if_else(MEMO_RE02 == 1,"VP","FN"))
}
crivo(memo_re)

R 正在做您要求它做的事情。在您的 crivo 函数定义中,您已将函数编写为 分配 您创建的名为 x 的新数据框到 R 环境.这就是 <<- 运算符所做的。在 运行 你的代码之后,使用 ls() 查看你的环境中有什么,然后查看 x。你会看到一切都在那里,就像你要求的那样,包括正确的变异 x 数据框。

> memo_re <- data.frame(MEMO_RE01=rep(c(0,1),100), MEMO_RE02=c(0,1))
> 
> crivo <- function(x) {
+   x <<- x %>% 
+     mutate(resp_1 = if_else(MEMO_RE01 == 0,"VN","FP")) %>% 
+     mutate(resp_2 = if_else(MEMO_RE02 == 1,"VP","FN"))
+ }
> crivo(memo_re)
> ls()
[1] "crivo"   "memo_re" "x"      
> head(x)
  MEMO_RE01 MEMO_RE02 resp_1 resp_2
1         0         0     VN     FN
2         1         1     FP     VP
3         0         0     VN     FN
4         1         1     FP     VP
5         0         0     VN     FN
6         1         1     FP     VP

现在,如果您想要 crivo() return 可以分配任何名称的东西,您应该使用

crivo <- function(x) {
  x %>% 
    mutate(resp_1 = if_else(MEMO_RE01 == 0,"VN","FP"), 
           resp_2 = if_else(MEMO_RE02 == 1,"VP","FN"))
}

请注意,我没有在任何地方使用过 <<- 运算符。结果,crivo fx 将 returning 突变的 x 数据帧,这样你就可以

new <- memo_re %>% crivo()

这样,您可以通过管道将任何您想要的内容 crivo 分配给任何新变量。或者,如果您只想调用 memo_re 上的函数,您也可以这样做:

memo_re <- memo_re %>% crivo()

请注意,"classic" 编写函数的方法是使用 return() 指定您想要的 fx 到 return。如果你不使用 return()(我上面没有使用),R 将 return 最后一行中的任何内容。在这里,它只是变异数据框。