Re: [問題] 篩選問題

看板R_Language作者 (cywhale)時間9年前 (2016/11/25 16:14), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
這樣寫好像符合你要的,好處是可以在你的selectbar可以複選 輸入也很彈性 library(data.table) library(magrittr) selx <- function(...,data,varname=c("A","B","C")) { x <- list(...) names(x) <- varname[1:length(x)] dt <- do.call(cbind, x) %>% data.table() %>% .[,which(unlist(lapply(., function(x)!all(is.na(x))))),with=F] %>% setkeyv(colnames(.)) return(dt %>% .[data %>% setkeyv(colnames(dt)), nomatch=0L] %>% .[,colnames(data),with=F] ) } data = fread('"食性" "生育方式" "生活地區" "肉食" "胎生" "水生" "草食" "胎生" "陸生" "肉食" "卵生" "水生" "雜食" "胎生" "兩棲" "草食" "胎生" "兩棲"') ## you can use ## selx(input$sela, input$selb, input$selc,..., data=data, varname=c(...)) selx(c(NA_character_), c(NA_character_), c("水生"), data=data, varname=colnames(data)) #食性 生育方式 生活地區 #1: 肉食 卵生 水生 #2: 肉食 胎生 水生 selx(c(NA_character_), c("胎生","卵生"), c("水生"), data=data, varname=colnames(data)) #食性 生育方式 生活地區 #1: 肉食 卵生 水生 #2: 肉食 胎生 水生 selx(c("雜食","草食"), c("卵生"), c("水生"), data=data, varname=colnames(data)) #Empty data.table (0 rows) selx(c("雜食","草食"), c("胎生"), c("兩棲"), data=data, varname=colnames(data)) #食性 生育方式 生活地區 #1: 草食 胎生 兩棲 #2: 雜食 胎生 兩棲 selx(c("肉食"), c("胎生"), c(NA_character_), data=data, varname=colnames(data)) #食性 生育方式 生活地區 #1: 肉食 胎生 水生 ※ 引述《clansoda (小笨)》之銘言: : 各位好,我不知道這個命題怎麼寫但是它是關於篩選的問題 : 假如我有三個可篩選的向量 : A 是 空白 老鼠 老虎 : B 是 空白 小時候 長大 : C 是 空白 卵生 胎生 : 我要做的是 假如A是空白 B也是空白 那就只篩 : dat[c == 使用者輸入的值] 這樣 : 假如只有B是空白 那就變成 : dat[A == 使用者輸入 & C == 使用者輸入] : 不知道我這樣解釋會不會不太清楚 : 就跟一般網頁的用法一樣,空白的就忽略它 : 但是我寫不出類似的感覺,只能用很多if來包裝 : 我覺得這樣程式會很複雜,所以來請教 : dat[A & B & C] 是我最想一次寫完的方式可是 : B如果是空白的話,就會導致整個data都沒辦法出來 : 想請問有什麼更好的方法可以寫這個篩選呢 : 前提是一定要有空白這個,因為如果不加空白這個選項 : 預設就會是老虎或老鼠其中一個,可是假如使用者不想篩的話 : 會沒辦法使用,因為A一定會是老虎或老鼠其中一個而不是兩種都呈現 : ------------------------------ : C大我在解釋一下,假如我有以下這個dataframe : 食性 生育方式 生活地區 : 1 肉食 胎生 水生 : 2 草食 胎生 陸生 : 3 肉食 卵生 水生 : 4 雜食 胎生 兩棲 : 5 草食 胎生 兩棲 : 假如使用者讓 食性 生育方式 生活地區三者皆留白則呈現的就是上面這個表格 : 如果使用者這時候去拉了第一個select bar讓食性 == 肉食 : 那這時候只會剩下第一跟第三個row : 他又去動了第二個select bar 讓生育方式 == 胎生 : 則只會留下第一個row : 我目前是已經想出來大概的做法,只剩下最後一步我還在google : 如果有大大能提示我怎麼做最理想不過了 : 這是我目前的作法 : 食性 <- ifelse(食性== "","","食性 == input$食性") : 生育方式 <-ifelse(生育方式 == "","","生育方式 == input$生育方式") : 生活地區 <-ifelse(生活地區 == "","","生活地區 == input$生活地區") : if (食性 == "" & 生育方式 == "" & 生活地區 == "") { : return(dat) } else { : picachu <- c(食性,生育方式,生活地區) %>% .[.! = ""] %>% paste(collapse = "&") : dat[picachu] %>% return : } : 上面的是我的作法,缺的這一步就是data.table不接受character在他的argument裏頭 : 上面的就會變成dat["食性 == 肉食 & 生育方式 == 胎生"] : 多了那兩個quote,請問有其他方法可以解決這整個問題或者是上面這個quote問題嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.65.48 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1480061698.A.D11.html
文章代碼(AID): #1OD_C2qH (R_Language)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1OD_C2qH (R_Language)