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