如何使用管道设置变量的 class?
How do I set the class of a variable using pipes?
我已经创建了一个函数,可以根据一些基本输入构建一个 tibble
library(tidyverse)
fun <- function(x, y) {
tibble(
start = x) %>%
mutate(k = x * y)
}
我想做的是在这个函数中设置每个变量的 class
。
fun <- function(x, y) {
tibble(
start = x) %>%
mutate(k = x * y) %>%
mutate_at(vars(x, k), "currency")
}
我试过了
fun <- function(x, y) {
tibble(
start = x) %>%
mutate(k = x * y) %>%
class(k) <- "currency"
}
我的目标是创建一个包含 classes 的 tibble,以便稍后使用 openxlsx
包导出。我找到了很多使用 mutate_at 函数将因子转换为数字等的方法,但找不到在同一函数中定义 tibble(或数据框)变量的 class 的方法它是创建的功能。我知道我可以在脚本中很容易地做到这一点,但似乎我应该能够在一个函数中做到这一点。
"currency"
class来自哪里?我能找到的最接近的是 formattable::currency
(甚至 returns class "formattable" "numeric"
)。在这种情况下,您可以这样做:
library(dplyr)
fun <- function(x, y) {
tibble(start = x) %>%
mutate(k = x * y) %>%
mutate_at(vars(start, k), formattable::currency)
}
fun(1:10, 2)
# A tibble: 10 x 2
# start k
# <formttbl> <formttbl>
# 1 .00 .00
# 2 .00 .00
# 3 .00 .00
# 4 .00 .00
# 5 .00 .00
# 6 .00 .00
# 7 .00 .00
# 8 .00 .00
# 9 .00 .00
#10 .00 .00
即使它来自一些不同的包,您也可以使用 class 中存在的默认方法执行相同的操作。例如,要将其更改为 "character"
class,您可以使用:
fun <- function(x, y) {
tibble(start = x) %>%
mutate(k = x * y) %>%
mutate_at(vars(start, k), as.character)
}
编辑
fun <- function(x, y) {
data <- tibble(start = x) %>% mutate(k = x * y)
data[c('k', 'start')] <- lapply(data[c('k', 'start')],
function(x) {class(x) <- "Currency";x})
return(data)
}
str(fun(1:10, 2))
#Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 10 obs. of 2 variables:
# $ start: 'Currency' int 1 2 3 4 5 6 7 8 9 10
# $ k : 'Currency' num 2 4 6 8 10 12 14 16 18 20
我已经创建了一个函数,可以根据一些基本输入构建一个 tibble
library(tidyverse)
fun <- function(x, y) {
tibble(
start = x) %>%
mutate(k = x * y)
}
我想做的是在这个函数中设置每个变量的 class
。
fun <- function(x, y) {
tibble(
start = x) %>%
mutate(k = x * y) %>%
mutate_at(vars(x, k), "currency")
}
我试过了
fun <- function(x, y) {
tibble(
start = x) %>%
mutate(k = x * y) %>%
class(k) <- "currency"
}
我的目标是创建一个包含 classes 的 tibble,以便稍后使用 openxlsx
包导出。我找到了很多使用 mutate_at 函数将因子转换为数字等的方法,但找不到在同一函数中定义 tibble(或数据框)变量的 class 的方法它是创建的功能。我知道我可以在脚本中很容易地做到这一点,但似乎我应该能够在一个函数中做到这一点。
"currency"
class来自哪里?我能找到的最接近的是 formattable::currency
(甚至 returns class "formattable" "numeric"
)。在这种情况下,您可以这样做:
library(dplyr)
fun <- function(x, y) {
tibble(start = x) %>%
mutate(k = x * y) %>%
mutate_at(vars(start, k), formattable::currency)
}
fun(1:10, 2)
# A tibble: 10 x 2
# start k
# <formttbl> <formttbl>
# 1 .00 .00
# 2 .00 .00
# 3 .00 .00
# 4 .00 .00
# 5 .00 .00
# 6 .00 .00
# 7 .00 .00
# 8 .00 .00
# 9 .00 .00
#10 .00 .00
即使它来自一些不同的包,您也可以使用 class 中存在的默认方法执行相同的操作。例如,要将其更改为 "character"
class,您可以使用:
fun <- function(x, y) {
tibble(start = x) %>%
mutate(k = x * y) %>%
mutate_at(vars(start, k), as.character)
}
编辑
fun <- function(x, y) {
data <- tibble(start = x) %>% mutate(k = x * y)
data[c('k', 'start')] <- lapply(data[c('k', 'start')],
function(x) {class(x) <- "Currency";x})
return(data)
}
str(fun(1:10, 2))
#Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 10 obs. of 2 variables:
# $ start: 'Currency' int 1 2 3 4 5 6 7 8 9 10
# $ k : 'Currency' num 2 4 6 8 10 12 14 16 18 20