免责声明:这是我第一次尝试编写功能
我正在处理来自网络资源的空气污染数据,而我正在尝试编写一个能够清理原始数据并将其结果存储到新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
。
答案 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)