Re: [問題] 篩選問題

作者: cywhale (cywhale)   2016-11-25 16:14:56
這樣寫好像符合你要的,好處是可以在你的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一定會是老虎或老鼠其中一個而不是兩種都呈現
:

Links booklink

Contact Us: admin [ a t ] ucptt.com