作者cywhale (cywhale)
看板R_Language
标题Re: [问题] 筛选问题
时间Fri Nov 25 16:14:56 2016
这样写好像符合你要的,好处是可以在你的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://webptt.com/cn.aspx?n=bbs/R_Language/M.1480061698.A.D11.html