作者celestialgod (天)
看板R_Language
标题Re: [问题] 用R数据条件判断分类
时间Thu Mar 16 22:19:01 2017
※ 引述《hizerg (路过的人)》之铭言:
: [问题类型]:
:
: 程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
:
: [软体熟悉度]:
:
: 入门(写过其他程式,只是对语法不熟悉)
:
: [问题叙述]:
: 请简略描述你所要做的事情,或是这个程式的目的
: 多组数值(甲、乙)
: 甲介於1~3间,且乙= M1得到K1
: 甲介於4~6间,且乙= M2得到K2
: 甲介於7~9间,且乙= M3得到K3
: 1.产生资料
: A <- c(1, 3, "M1", "K1")
: B <- c(4, 6, "M2", "K2")
: C <- c(7, 9, "M3", "K3")
: X1 <- c(3, "M1")
: X2 <- c(4, "M1")
: X3 <- c(8, "M3")
: 当X1资料丢进去判断,得到K1
: 当X2资料丢进去判断,得到null
: 当X3资料丢进去判断,得到K3
: 这个用回圈写会比较好?(完全没头绪)
: 谢谢各位前辈
:
: [环境叙述]:
:
: R version 3.3.3 (2017-03-06)
: Windows 7 x64 Service Pack 1
:
: [关键字]:
:
: R语言多重数据判断分类
:
虽然你是新手QQ
如果你连data.frame都不会用,请先去补强R的基本知识...
data.frame是R里面处理字串、数字混合型最方便的型别
而data.table提供记忆体面的相同操作,比data.frame更快
尝试先把你的资料用data.table表示
然後直接套用data.table的non-equi join,瞬间就可以得到答案了:
library(data.table)
judgeDT <- data.table(x_lb = c(1, 4, 7), x_ub = c(3, 6, 9),
y_cate = paste0("M", 1:3), output = paste0("K", 1:3))
judgeDT
# x_lb x_ub y_cate output
# 1: 1 3 M1 K1
# 2: 4 6 M2 K2
# 3: 7 9 M3 K3
inputDT <- unique(data.table(X = sample(1:10, 100, TRUE),
Y = sample(paste0("M", 1:3), 100, TRUE)))
head(inputDT)
# X Y
# 1: 3 M2
# 2: 10 M3
# 3: 4 M3
# 4: 3 M1
# 5: 6 M3
# 6: 6 M2
judgeDT[inputDT, .(X, Y, output), on = .(x_lb <= X, x_ub >= X, y_cate == Y)]
# X Y output
# 1: 3 M2 NA
# 2: 10 M3 NA
# 3: 4 M3 NA
# 4: 3 M1 K1
# 5: 6 M3 NA
# 6: 6 M2 K2
如果没办法接受就直接回圈吧:
judgeDF <- data.frame(x_lb = c(1, 4, 7), x_ub = c(3, 6, 9),
y_cate = paste0("M", 1:3), output = paste0("K", 1:3),
stringsAsFactors = FALSE)
inputDF <- unique(data.frame(X = sample(1:10, 100, TRUE),
Y = sample(paste0("M", 1:3), 100, TRUE),
stringsAsFactors = FALSE))
inputDF$output <- rep(NA_character_, nrow(input))
for (i in 1L:nrow(inputDF)) {
loc <- which(inputDF[i, 1] >= judgeDF[, 1] & inputDF[i, 1] <= judgeDF[, 2] &
inputDF[i, 2] == judgeDF[, 3])
if (length(loc) > 0L) {
inputDF$output[i] <- judgeDF[loc, 4]
} else {
inputDF$output[i] <- NA
}
}
--
R资料整理套件系列文:
magrittr #1LhSWhpH (R_Language) https://goo.gl/72l1m9
data.table #1LhW7Tvj (R_Language) https://goo.gl/PZa6Ue
dplyr(上.下) #1LhpJCfB,#1Lhw8b-s (R_Language) https://goo.gl/I5xX9b
tidyr #1Liqls1R (R_Language) https://goo.gl/i7yzAz
pipeR #1NXESRm5 (R_Language) https://goo.gl/zRUISx
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.233.137.157
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1489673944.A.37D.html
1F:推 hizerg: 感谢版主! 认真想一下怎麽写 03/16 22:31
2F:→ hizerg: 共有50组条件 与5000多笔资料要跑 03/16 22:31
如果你条件是上面那样的五十组,只要资料塞进data.frame,剩下简单了...
如果是五十个条件,没有办法像是你的例子那样正规化,那就只能写if-else
3F:推 hizerg: 这真的提供我一个很棒的方向 起码让我知道对的工具 感谢!! 03/16 22:35
你大概就用csv存资料,用read.table读进来就好了XD
4F:推 hizerg: 我打算用csv存资料 在整行整行汇入 再用if-else写写看 03/16 22:41
5F:→ hizerg: 不过data.frame和table也需要好好研究 03/16 22:41
一步步来,先学好data.frame + vectorization的程式逻辑...
data.table算是满难的套件
※ 编辑: celestialgod (36.233.137.157), 03/16/2017 23:37:38