Re: [问题] 资料分类

楼主: koai (可笑的自以为...)   2014-02-10 11:52:40
※ 引述《puppy77 ( )》之铭言:
: [问题类型]:
: 程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
: [软件熟悉度]:
: 入门(写过其他程式,只是对语法不熟悉)
: [问题叙述]:
: 我有n笔资料,每笔资料都有m个变量,存在data.frame里面(维度n*m)
: 需要依照m个变量的值去做分类,譬如当一笔资料
: V1<0 and V2>V3 and V4 %in% c("W","Z")
: 就会分类为第1类
: 类别有很多,大约30类左右
: 希望最后得到一个长度n的向量,向量里面的数字就是分类的编号
: 原本是想用if else if去做,但似乎不能用在向量上
: 只会对第一笔资料做判断(这部分我不是非常确定,还请大家纠正)
: 所以外面需要套上for循环去一笔一笔判断
: 但因为资料非常多,还是希望能够以向量的方式下去做
: 我目前的做法是
: result = rep(0,n) #记录最后分类结果的向量
: fg = rep(T,n) #记录每一笔资料是否被分类过(已分类F,未分类T)
: r1 = 是否符合第1类条件的向量(长度n,内容全是T or F)
: result[r1 & fg] = 1
: fg[r1 & fg] = F
^^^^^^^^^^^^^^^^^^^
有这个动作是因为被分类为类别1者,
有可能会满足其他分类的条件,
但类别数字较小者较强, 即
若某列资料同时满足两个以上的分类条件,
则此列资料被分类为最小编号类!
是这样子解释吗?
如果这就是你要作的事,
可参考以下做法:
n <- 100
m <- 10
X <- data.frame(matrix(sample(-10:10,n*m,r=T),n))
names(X) <- paste("V",1:ncol(X),sep="")
X[1:5,]
result <- rep(0,n)
result[ X$V10>5 & X$V5>X$V7 & X$V8 %in% c(3: 6)] <- 30
result[ X$V4>3 & X$V9>X$V2 & X$V2 %in% c(1: 4)] <- 29
# result["第28类条件"] <- 28
# result["第27类条件"] <- 27
##
## 条件区为必要的部分, 不知道其他高手是否有更精简的写法... @@"
##
result[ X$V1<0 & X$V2>X$V3 & X$V4 %in% c(5,10)] <- 1
result
## 越强的分类越晚判断,这样可以省去你做 "fg[r1 & fg] = F" 动作的必要性!
## 不知道这是不是你要作的事, 好像只有节省一点力气而已, 参考看看吧!
: r2 = 是否符合第2类条件的向量
: result[r2 & fg] = 2
: fg[r2 & fg] = F
: 依此类推到最后
: 虽然这个已达到我的要求,不过还是稍嫌麻烦,不知道有无更俐落的写法?
作者: puppy77 ( )   2014-02-10 22:11:00
对!!如果同时符合两种以上的分类是以最小编号为优先其实我原本期望得到的答案是类似SQL里面case when的指令不过你的方法完全突破我原本程式的盲点阿!!!!太感谢了!!!
作者: Wush978 (拒看低质媒体)   2014-02-11 08:44:00
或是使用sqldf套件用SQL操作data.frame

Links booklink

Contact Us: admin [ a t ] ucptt.com