【问题标题】:GUI to subset a data frame in RGUI在R中对数据框进行子集化
【发布时间】:2012-09-07 20:58:09
【问题描述】:

我正在 R 中构建一个自定义 GUI 用于工作,我需要有一个部件可以根据变量值选择数据框的子集(即选择所有 50 岁以上的女性等)。我正在使用 gwidgets 构建 GUI,但我对如何实现此过滤器感到困惑。具体如何创建一个允许用户选择一个或多个过滤器然后返回过滤后的数据框的小部件。

这是我正在处理的数据中的一个小样本:

structure(list(kunde = c(3, 3, 3, 3, 3, 3, 3, 1, 3, 3), 
               bank = c(7,98, 3, 3, 98, 2, 2, 1, 7, 2)),
          .Names = c("kunde", "bank"), row.names = c(NA, 10L), class = "data.frame")

非常感谢任何帮助!

【问题讨论】:

  • ???当您的数据对象中没有这样的值时,您打算如何对“女性”进行子集化?
  • 性别变量在数据中,但我只是在问题中将其用作示例。我想任何显示如何使用发布的子集进行过滤的示例都可以很容易地用于过滤给定的性别变量;)
  • 您可能希望考虑将您的 GUI 嵌入到更大的框架中,例如 Deducer 或 R Commander。您将免费获得其中一些数据操作任务。 (例如deducer.org/pmwiki/pmwiki.php?n=Main.Subset

标签: r user-interface filter subset gwidgets


【解决方案1】:

ProgGUIinR 包中有一些类似的例子。这是其中之一:

library(gWidgets)
options(guiToolkit="RGtk2")
options(repos="http://streaming.stat.iastate.edu/CRAN")
d <- available.packages()       # pick a cran site

w <- gwindow("test of filter")
g <- ggroup(cont=w, horizontal=FALSE)
ed <- gedit("", cont=g)
tbl <- gtable(d, cont=g, filter.FUN="manual", expand=TRUE)

ourMatch <- function(curVal, vals) {
  grepl(curVal, vals)
}

id <- addHandlerKeystroke(ed, handler=function(h, ...) {
  vals <- tbl[, 1, drop=TRUE]
  curVal <- svalue(h$obj)
  vis <- ourMatch(curVal, vals)
  visible(tbl) <- vis
})

出于您的目的,您可能希望使用gcheckboxgroupgcombobox 来选择因子水平或水平并按此过滤。关键是gtable对象的visible&lt;-方法用于过滤显示的项目。

如果你喜欢玩游戏,你可以试试gWidgets2 中的gfilter 小部件,据我所知,它就在我的 github 网站上(使用来自 devtools 的 install_packages("gWidgets2", "jverzani"),也可以使用 gWidgets2RGtk2)。这可能正是您想要做的。

【讨论】:

    【解决方案2】:

    使用您的数据对象并测试其中一个变量,这是subset.data.frame 的简化版本:

    tmp <- 
    structure(list(kunde = c(3, 3, 3, 3, 3, 3, 3, 1, 3, 3), bank = c(7, 
    98, 3, 3, 98, 2, 2, 1, 7, 2)), .Names = c("kunde", "bank"), row.names = c(NA, 
    10L), class = "data.frame")
    
     getsub <- function(obj, logexpr) if (missing(logexpr)) {return(obj)
            } else {e <- substitute(logexpr)
             r <- eval(e, obj, parent.frame())
             if (!is.logical(r)) 
                 stop("'subset' must evaluate to logical")
             r <- r & !is.na(r)
             obj[r, ] }
    
     getsub(tmp, bank <50)
    #--------------
       kunde bank
    1      3    7
    3      3    3
    4      3    3
    6      3    2
    7      3    2
    8      1    1
    9      3    7
    10     3    2
    

    【讨论】:

    • 感谢您的代码,但是您将如何使用 gwidgets 实现它?
    猜你喜欢
    • 2021-12-04
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 2020-04-26
    • 2018-06-21
    • 2017-07-29
    • 1970-01-01
    相关资源
    最近更新 更多