如何在具有给定名称的df中存储自定义函数的结果

时间:2018-01-06 11:46:32

标签: r function

免责声明:这是我第一次尝试编写功能

我正在处理来自网络资源的空气污染数据,而我正在尝试编写一个能够清理原始数据并将其结果存储到新data.frame的功能( tbl_df)对象。

我无法找到如何将要创建的新对象的名称作为参数传递给我的函数。

(任何关于优化我的代码的建议都会受到欢迎)

我的功能必须执行以下操作: - 阅读原始数据(工程)
- 查找所有以逗号为小数的列(作品)
- 用点替换逗号并将列转换为数字(作品)
- 根据参数清除列名(实际上:删除-之后的整个字符串)(工作)
- 以新名称(不工作

将结果存储为新对象

以下是一些示例数据I dput()从原始数据中采样行和列:

df <-
      structure(
            list(
                  `Czas pomiaru` = structure(
                        c(1462878000, 1452074400,
                          1475539200),
                        class = c("POSIXct", "POSIXt"),
                        tzone = "UTC"
                  ),
                  `MpKrakBujaka-PM2.5-1g` = c("11,6384", "101,609", "11,329"),
                  `SkMalo11List-PM2.5-1g` = c("4,32", "42,4", "7,65"),
                  `DsJelGorOgin-PM2.5-1g` = c("7,98814",
                                              "56,1844", "6,2")
            ),
            .Names = c(
                  "Czas pomiaru",
                  "MpKrakBujaka-PM2.5-1g",
                  "SkMalo11List-PM2.5-1g",
                  "DsJelGorOgin-PM2.5-1g"
            ),
            row.names = c(NA,
                          -3L),
            class = c("tbl_df", "tbl", "data.frame")
      )

我的目标是更改数据:

Observations: 3
Variables: 4
$ `Czas pomiaru`          <dttm> 2016-05-10 11:00:00, 2016-01-06 10...
$ `MpKrakBujaka-PM2.5-1g` <chr> "11,6384", "101,609", "11,329"
$ `SkMalo11List-PM2.5-1g` <chr> "4,32", "42,4", "7,65"
$ `DsJelGorOgin-PM2.5-1g` <chr> "7,98814", "56,1844", "6,2"

进入这个:

'data.frame':   3 obs. of  4 variables:
 $ Czas.pomiaru: POSIXct, format: "2016-05-10 11:00:00" ...
 $ MpKrakBujaka: num  11.6 101.6 11.3
 $ SkMalo11List: num  4.32 42.4 7.65
 $ DsJelGorOgin: num  7.99 56.18 6.2

我最好的工作示例如下:

cleanGios<- function(pollutantCode, data, newObject){
      require(tidyverse)
      require(magrittr)
      data %<>%
            mutate_at(vars(contains("-")),
                      str_replace,
                      pattern = ",",
                      replacement = "\\.") %>%
            mutate_at(vars(contains("-")), funs(as.numeric))
      colNames <- data %>%
            names() %>%
            str_replace(pattern = pollutantCode, replacement = "")
      names(data) <- colNames
      newObject<<- data.frame(data)
}

运行后

cleanGios("-PM2.5-1g", df, pm25_2016)

创建了一个新的已清理tbl_df但名称错误:newObject而不是函数参数中指定的pm25_2016

1 个答案:

答案 0 :(得分:2)

mutate_at之后,使用rename_at

res <- df %>%
         mutate_at(vars(contains('-')), funs(as.numeric(str_replace(., ',', '.')))) %>%
         rename_at(vars(contains('-')), funs(str_replace(., '-.*', '')))

str(res)
#Classes ‘tbl_df’, ‘tbl’ and 'data.frame':       3 obs. of  4 variables:
#  $ Czas pomiaru: POSIXct, format: "2016-05-10 11:00:00" "2016-01-06 10:00:00" "2016-10-04 00:00:00"
#  $ MpKrakBujaka: num  11.6 101.6 11.3
#  $ SkMalo11List: num  4.32 42.4 7.65
#  $ DsJelGorOgin: num  7.99 56.18 6.2

将其包装在一个函数中

cleanGios<- function(pollutantCode, data){
       data %>%
         mutate_at(vars(contains('-')), funs(as.numeric(str_replace(., ',', '.')))) %>%
         rename_at(vars(contains('-')), funs(str_replace(., pollutantCode, '')))
  }

cleanGios("-PM2.5-1g", df)