我从Google AnalyticsAPI中提取数据,在本地处理数据,然后将.Rmd文件编织为文本,表格和可视化。作为编织/制表过程的一部分,我做了一些基本的格式化(例如,舍入百分比和添加%符号)。
对于这个问题,我有toPercent()
,如果像这样使用它可以正常工作:
toPercent <- function(percentData){
percentData <- round(data, 2)
percentData <- mapply(toString, percentData)
percentData <- paste(percentData, "%", sep="")
}
devices <- toPercent(devices$avgSessionDuration)
但是,为每个表手动设置功能是耗时的。我创建了percentCheck()
以查找符合我条件的列:
percentCheck <- function(data){
data[,grep("rate|percent", names(data), ignore.case=TRUE)] <- toPercent(data[,grep("rate|percent", names(data), ignore.case=TRUE)])
}
devices <- percentCheck(devices)
但我知道这并不适用于具有多个匹配项的数据集(例如exitRate
的列和bounceRate
的列)。
Q1:我是否以不会将多个值返回到一个条目的方式编写toPercent()
?
Q2:如何构建percentCheck()
以映射数据集,并且只有在列名称包含给定字符串时才应用toPercent()
?
版本/封装
R version 3.1.1 (2014-07-10) -- "Sock it to Me"
library(rga)
library(knitr)
library(stargazer)
数据:
> dput(devices)
structure(list(deviceCategory = c("desktop", "mobile", "tablet"
), sessions = c(817, 38, 1540), avgSessionDuration = c(153.424888853179,
101.942758538617, 110.270988142292), bounceRate = c(39.0192297391397,
50.2915625371891, 50.1343873517787), exitRate = c(25.3257456030279,
32.0236280487805, 29.0991902834008)), .Names = c("deviceCategory",
"sessions", "avgSessionDuration", "bounceRate", "exitRate"), row.names = c(NA,
-3L), class = "data.frame")
答案 0 :(得分:2)
这次修改怎么样:
percentCheck <- function(data){
idx <- grepl("rate|percent", names(data), ignore.case=TRUE)
data[idx] <- lapply(data[idx], function(x) paste0(sprintf("%.2f", round(x,2)), "%"))
return(data)
}
在这里,我首先使用grepl
来创建符合指定条件的列和索引。然后,在lapply
中使用此索引将其应用于所有这些列,并且应用的函数与您的toPercent
函数类似,只是我发现它更紧凑。
现在,您可以一次性将它应用于整个数据集:
percentCheck(devices)
# deviceCategory sessions avgSessionDuration bounceRate exitRate
#1 desktop 817 153.4249 39.02% 25.33%
#2 mobile 38 101.9428 50.29% 32.02%
#3 tablet 1540 110.2710 50.13% 29.10%