使用ifelse语句来压缩变量

时间:2014-09-26 23:38:25

标签: r if-statement

R的新手,以极少的指令进行非常加速的课程。如果这是一个菜鸟问题,我提前道歉。

我的任务是从数据帧中获取一个具有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"))))))))))))))

LANDFORM是一个因素,但我也尝试将其更改为角色,但代码仍然无效。

" ws_type"是其余变量的全部捕获。

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

> unique(b2$LANDFORM)

[1] NA" af_type"

我是否走在正确的道路上?有什么建议?我是否应该咬紧牙关并使用substr()创建一个新列?提前谢谢。

2 个答案:

答案 0 :(得分: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"))

答案 1 :(得分:0)

经过大量的实验,我咨询了一位同事,他能够简化大量的这项工作。基本上,我应该在LANDFORM中创建一个由变量的前两个字母组成的新列,然后从该新列中进行采样并替换LANDFORM中的值,以使ifelse()语句更短。代码是:

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

B2 $地貌= ifelse(B2 $索引==&#34; AF&#34;&#34; af_type&#34 ;,
       ifelse(B2 $索引==&#34; BF&#34;&#34; bf_type&#34 ;,
       ifelse(B2 $索引==&#34;磅&#34;&#34; lb_type&#34 ;,
       ifelse(B2 $索引==&#34; WB&#34;&#34; wb_type&#34 ;,
       ifelse(B2 $索引==&#34; WS&#34;&#34; ws_type&#34;&#34; ub_type&#34;)))))

     

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

感谢所有给我一些指导的人!