Re: [問題] 篩選問題
這樣寫好像符合你要的,好處是可以在你的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
討論串 (同標題文章)
R_Language 近期熱門文章
PTT數位生活區 即時熱門文章