映射数据框列,如果列满足条件,则将函数应用于数据

时间:2014-08-20 14:43:15

标签: r google-analytics

我从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")

1 个答案:

答案 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%