R_Language 板


LINE

这样写好像符合你要的,好处是可以在你的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







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP