2014-09-26 202 views
0

R的新手,在非常小的指令下采用非常加速的类。所以如果这是一个菜鸟问题,我提前道歉。使用ifelse语句来压缩变量

我的任务是从数据框中取一个具有21个级别的特定列,并使用if或ifelse语句将它们压缩到4个级别。我已经试过什么感觉上百的组合,但这似乎最有前途的代码:

> b2$LANDFORM=ifelse(b2$LANDFORM=="af","af_type", 
     ifelse(b2$LANDFORM=="aflb","af_type", 
     ifelse(b2$LANDFORM=="afub","af_type", 
     ifelse(b2$LANDFORD=="afwb","af_type", 
     ifelse(b2$LANDFORM=="afws","af_type", 
     ifelse(b2$LANDFORM=="bfr","bf_type", 
     ifelse(b2$LANDFORM=="bfrlb","bf_type", 
     ifelse(b2$LANDFORM=="bfrwb","bf_type", 
     ifelse(b2$LANDFORM=="bfrwbws","bf_type", 
     ifelse(b2$LANDFORM=="bfrws","bf_type", 
     ifelse(b2$LANDFORM=="lb","lb_type", 
     ifelse(bs$LANDFORM=="lbaf","lb_type", 
     ifelse(b2$LANDFORM=="lbub","lb_type", 
     ifelse(b2$LANDFORM=="lbwb","lb_type","ws_type")))))))))))))) 

地貌是一个因素,但我试图将其更改为一个字符过了,该代码仍然没工作。

“ws_type”是其余变量的全部。

代码运行没有错误,但是当我检查,我得到的是:

> unique(b2$LANDFORM) 

[1] NA “af_type”

难道我连上了正确的道路?有什么建议么?我应该咬子弹并用substr()创建一个新列吗?提前致谢。

+0

所以基本上你想要重新调整列,听起来像?这个专栏应该在改变之后仍然是一个因素吗?看看'?levels',特别是'levels <-'替换函数 – 2014-09-26 23:51:07

+0

好主。另请看'%in%'。 – shadowtalker 2014-09-27 01:23:53

+0

@RichardScriven,水平看起来很有希望。你有什么例子吗?我在R手册中查看了这个命令,但这些例子非常简单... – Charlie 2014-09-28 22:30:59

回答

0

尝试大量后,我咨询了同事,并且他能够简化大量的这些。基本上,我应该在LANDFORM中创建一个由变量的前两个字母组成的新列,然后从该新列中抽样并替换LANDFORM中的值,以便使ifelse()语句更短。的代码是:

> b2$index=as.factor(substring(b2$LANDFORM,1,2)) 

B2 $地貌= ifelse(B2 $索引== “AF”, “af_type”
ifelse(B2 $索引== “BF”, “bf_type”
(b2 $ index ==“lb”,“lb_type”,
ifelse(b2 $ index ==“wb”,“wb_type”,
ifelse(b2 $ index ==“ws”,“ws_type”, “ub_type”)))))

B2 $地貌= as.factor(B2 $地貌)

感谢大家给我一些指导!

1

如果新的水平都只是旧的,然后_type的前两个字母就可以轻松实现你想要的通过:

 #prototype of your column 
    mycol<-factor(sample(c("aflb","afub","afwb","afws","bfrlb","bfrwb","bfrws","lb","lbwb","lbws","wslb","wsub"), replace=TRUE, size=100)) 
    as.factor(paste(sep="",substr(mycol,1,2),"_type")) 
+0

唯一的问题是我无法为“ws_type”变量做这件事,因为它结合了所有剩余的变量,包括那些没有从“ws”开始。 ws-type应该是“wb”,“wblb”,“wbub”,“wbws”,“ws”和“wslb”的全部。 这就是为什么我认为“ifelse”声明会起作用,因为它忽略了字母,只是强制其余变量为“ws_type” – Charlie 2014-09-28 20:45:36

+0

如果只是这个问题,您可以尝试'mycol [mycol ==“wb_type” ] < - “ws_type”'后我的建议。 – nicola 2014-09-28 21:03:07

+0

我完全按照您所显示的方式运行代码,除了将“mycol”更改为“b2 $ LANDFORM”和size = 228以匹配我的数据结构。 B2 $地貌=因子(样品(C( “AF”, “AFLB”, “afub”, “afwb”, “afws”, “bfrlb”, “bfrwb”, “bfrws”, “BFR”, “BFR”, “paste”(sep =“”,“bfrwbws”,“lb”,“lbaf”,“lbub”,“lbwb”,“wslb”,“ws”),replace = TRUE,size = 228))asyfactor substr(b2 $ LANDFORM,1,2),“_ type”)) 但是,当我使用head()命令检查它时,新的LANDFORM变量与它们的“旧”变量不匹配。他们甚至不采用“_type”后缀,也没有一致性。 “lb”变成了“lbwb”,“afwb”,“af”,“aflb”以及更多 – Charlie 2014-09-28 22:10:50