【问题标题】:Map over data frame columns, apply function to data if column meets condition映射数据框列,如果列满足条件,则将函数应用于数据
【发布时间】:2014-08-20 23:00:02
【问题描述】:

我从 Google Analytics API 中提取数据,在本地对其进行处理,然后将 .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")

【问题讨论】:

    标签: r google-analytics


    【解决方案1】:

    这个修改怎么样:

    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%
    

    【讨论】:

    • 谢谢!我正在为不同的 GA 数据类型构建更多的格式化函数,这似乎可以顺利地接受那些其他函数。说到这里,你知道 R 中的 *apply() 有什么好的初学者教程吗?
    • 您绝对可以在这里查看:stackoverflow.com/questions/3505701/… 以及更多信息,我只需 google 和/或查看基本的 R 教程,如 cran.r-project.org/doc/manuals/R-intro.pdf。就我个人而言,我建议开始学习 applysapplylapply,然后才开始学习 mapply vapply tapply 等其他人。
    猜你喜欢
    • 2020-06-27
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 2021-10-15
    • 2020-01-26
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多