我使用 openxlsx 包创建excel文件。要将列格式化为美元,示例说要将类设置为' currency':
df <- data.frame(sales = c(10, 20, 30, 40, 50), returns = c(-5, -10, -20, 0, 0))
class(df$sales) <- 'currency'
class(df$sales)
[1] "currency"
但是,我想将它作为一次应用于许多列,并重复一次用于货币,一次用于百分比等。这是我的最终目标,但是我到达那里 - 这是我迄今为止尝试过的。
首先是工作示例:
df %>%
mutate_all(`class<-`(., 'currency'))
Error: Can't create call to non-callable object
现在使用dplyr和mutate 尝试1:
df <- df %>%
`class<-`(., 'currency')
df
$sales
[1] 10 20 30 40 50
attr(,"class")
[1] "currency"
尝试2:
select
c_num, count(DISTINCT c_date)
from table_a
group by c_num
having count(DISTINCT c_date) > 1
这更接近我想要的但是输出是一个列表而as.data.frame和as.tbl都抱怨没有类的货币&#39;的方法。
当我使用课程(df $ sales)&lt; - &#39; currency&#39;我能够在现有数据框中更改类。
我觉得这是一个很好的机会来学习更多关于课程的内容(我在课程上回顾了高级R部分,但无法解决我的问题)
答案 0 :(得分:3)
回应@ Frank上面的评论:
as.currency <- function(x) {class(x) <- "currency"; x}
iris %>% mutate_all(funs(as.currency(.))) %>% glimpse
Observations: 150 Variables: 5 $ Sepal.Length <S3: currency> 5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, 5.8, 5.7, 5.4, 5.1, 5.7, 5.1, ... $ Sepal.Width <S3: currency> 3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4, 3.0, 3.0, 4.0, 4.4, 3.9, 3.5, 3.8, 3.8, ... $ Petal.Length <S3: currency> 1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.6, 1.4, 1.1, 1.2, 1.5, 1.3, 1.4, 1.7, 1.5, ... $ Petal.Width <S3: currency> 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1, 0.2, 0.2, 0.1, 0.1, 0.2, 0.4, 0.4, 0.3, 0.3, 0.3, ... $ Species <S3: currency> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
答案 1 :(得分:2)
可以使用purrr
,但如果每列也继承自numeric
(即货币和数字),则结果只能强制转换为数据框。我不知道这对openxlsx
是否足够好。
dfr <- data.frame(x=1:10, y=1:10, z=1:10)
library(purrr)
as.data.frame(map(dfr, `class<-`, c("currency","numeric")))
给出
sapply(x, class)
x y z
[1,] "currency" "currency" "currency"
[2,] "numeric" "numeric" "numeric"
答案 2 :(得分:1)
我不确定如何使用dplyr
执行此操作,但这是一种有效的方法。
# list the column names
names <- colnames(df)
# loop through the columns and assign the class 'currency'
for (i in 1:length(names)){
class(df[, names[i]]) <- 'currency'
}
lapply(df, class)
$sales
[1] "currency"
$returns
[1] "currency"