2015-10-28 104 views
3

我想給Land列縮寫爲4個字母如果Import是小於(<)5000000縮寫()在if()語句

數據:

> head(dataAgg) 
     Land  Import Export 
1 Belgien 455223422 5787 
2 Bulgarien 6151445 115 
3 Cypern 1683563  95 
4 Danmark 1007626421 8810 

我想像這樣的東西會工作:

if(dataAgg$Import < 5000000) abbreviate([i], 4) 

回答

10

你不需要if()聲明或一個循環。您可以使用邏輯子集。

w <- dataAgg$Import < 5e6L 
dataAgg$Land <- as.character(dataAgg$Land) 
dataAgg$Land[w] <- abbreviate(dataAgg$Land[w]) 
dataAgg 
#  Land  Import Export 
# 1 Belgien 455223422 5787 
# 2 Bulgarien 6151445 115 
# 3  Cypr 1683563  95 
# 4 Danmark 1007626421 8810 

另一種選擇是data.table包。在這裏,我們不需要強制性格,因爲data.table以其迷人的更新因素。

library(data.table) 
setDT(dataAgg)[Import < 5e6L, Land := abbreviate(Land)] 

如果需要,你可以運行setDT(...)[...][, Land := droplevels(Land)]之後不再移除舊的水平,使用的縮寫後這給

 Land  Import Export 
1: Belgien 455223422 5787 
2: Bulgarien 6151445 115 
3:  Cypr 1683563  95 
4: Danmark 1007626421 8810 

此外,請注意,abbreviate()中的默認minlength是4,因此我們可以將該參數留出。

+0

謝謝,但沒有工作。 '> dataAgg $土地[W] [1] 26等級:比利時Bulgarien Cypern丹麥愛沙尼亞芬蘭Frankrike Grekland愛爾蘭意大利拉脫維亞Litauen盧森堡... Ungern' – Demandred

+0

@JoakimBäcklund - 我做了編輯。它現在應該工作。我們需要將因子列轉換爲字符。 –