将data.frame作为参数传递给函数

时间:2017-04-19 14:50:14

标签: r function

上下文

作为R: Pass data.frame by reference to a functionHow to add a column in the data frame within a function

的后续内容

我正在尝试以下看似简单的功能:

> str(WFM) Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 990571 obs. of 14 variables: $ Date : chr "04/12/2017" "04/12/2017" "04/12/2017" "04/12/2017" ... $ Time :Classes 'hms', 'difftime' atomic [1:990571] 41970 41969 41968 41967 41966 ... .. ..- attr(*, "units")= chr "secs" $ Bar# : chr "197953/197953" NA "197952/197953" NA ... $ Bar Index : int 0 NA -1 NA NA -2 NA NA -3 NA ... $ Tick Range: int 0 NA 0 NA NA 0 NA NA 0 NA ... $ Open : num 33.9 NA 33.9 NA NA ... $ High : num 33.9 NA 33.9 NA NA ... $ Low : num 33.9 NA 33.9 NA NA ... $ Close : num 33.9 NA 33.9 NA NA ... $ Vol : int 100 NA 200 NA NA 100 NA NA 400 NA ... $ MACDHist : num -59 NA -87 NA NA ... $ MACD : num -450 NA -445 NA NA ... $ MACDSig : num -391 NA -358 NA NA ... $ ZScore1 : num NA NA NA NA NA NA NA NA NA NA ...

Data.frame

WFM$Vol[is.na(WFM$Vol)] <- 0

希望使用此功能加快数据清理速度。

问题

在脚本编辑器中运行该函数后,再传递一个data.frame来运行它。但是该功能没有做任何事情,当我查看(WFM)时,它仍然是相同的旧数据。但是,当我手动运行命令时:

WFM <- naToZero(WFM)

然后它有效。

我尝试过的事情

我尝试基于我看到的两个链接进行实验,看似相关:

使用WFM <- data.table(WFM)生成一个具有单个值0的向量。

尝试使用xhttpRequest并运行函数......同样的事情。

我必须遗漏一些基本的东西。

2 个答案:

答案 0 :(得分:5)

实际上R中的所有对象都是不可变的:操作不会修改原始对象,而是创建副本。因此,您需要将该副本分配回原始

<-会这样做,但它会在您的函数中分配df ,这是参数的副本(= {{1你传递给你的函数。

所以你需要修改你的功能:

WFM

......以及你如何称呼它:

naToZero <- function(df) {
    df$Vol[is.na(df$Vol)] <- 0
    df
}

答案 1 :(得分:1)

我们可以使用dplyr的devel版本(即将发布0.6.0)使其更具动态性

library(tidyverse)
naToZero <- function(df, Col) {
    Col <- enquo(Col)
    ColN <- quo_name(Col)
     df %>% 
      mutate(!!ColN := replace(!!Col, is.na(!!Col), 0))


}

naToZero(WFM, Vol)
# A tibble: 3 × 2
#       Date   Vol
#      <chr> <dbl>
#1 04/12/2017     0
#2 04/12/2017    23
#3 04/12/2017    40

或任何其他列

naToZero(WFM, Open)
# A tibble: 3 × 3
#       Date   Vol  Open
#       <chr> <dbl> <dbl>
#1 04/12/2017    NA  33.9
#2 04/12/2017    23   0.0
#3 04/12/2017    40  32.0

enquo通过获取输入参数并将其转换为substitute,与base R的{​​{1}}功能类似。在quosure中,我们可以取消引用(mutate!!)来评估列以及使用UQ

创建的lhs上的字符串

数据

quo_name