簡體   English   中英

GUI用於在R中對數據幀進行子集化

[英]GUI to subset a data frame in R

我正在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")

任何幫助是極大的贊賞!!

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來選擇因子級別或級別並gcombobox過濾。 關鍵是visible<- gtable對象的方法用於過濾顯示的項目。

如果你是游戲,你可以嘗試gfilter窗口小部件gWidgets2 (使用其作為專門的只是在我的github網站install_packages("gWidgets2", "jverzani")從devtools,也gWidgets2RGtk2 )。 這可能就是你想要做的。

使用您的數據對象並測試其中一個變量,這是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM