2014-09-26 178 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