2017-09-02 123 views
2

問題很簡單。出於某種原因,我想不出一個簡單的解決方案,我不能在網上找到一個解決方案。讓我們假設這是我的數據,其中變量是一個因素:替換要素級別中的元素

Time 
8:10 
8:15 
8:30 
8:45 
10:10 
10:15 
10:45 

我想所有的水平在10轉換成8,那裏的結局是這樣的:

Time 
8:10 
8:15 
8:30 
8:45 
8:10 
8:15 
8:45 

哪有我做這個?

+1

這裏有一種方法:'時間< - 因子(分( 「^ 10」, 「8」,時間))'。請注意,這會降低以'10'開頭的先前級別。 –

+0

我應該加一個':'來代替小時不是分鐘,對吧?只需仔細檢查一下。 – user2105555

+1

不,請按原樣嘗試。另外,如果你不想刪除我在第一條評論中提到的關卡,只需使用'sub(。)',不要在其周圍包裹'因子'。 –

回答

2

由於@Rui Barradas的建議,你可以這樣做:

Time <- as.factor(c(
"8:10", 
"8:15", 
"8:30", 
"8:45", 
"10:10", 
"10:15", 
"10:45" 
)) 

factor(sub("^10", "8", Time)) 
[1] 8:10 8:15 8:30 8:45 8:10 8:15 8:45 
Levels: 8:10 8:15 8:30 8:45 

要回答你的問題:「我要補充一個:不更換小時分鐘,右」 - 不,你不需要這樣做。子參數中的'^'表示正則表達式中字符串的開始。所以這隻會選擇幾個小時。

如果我們需要擴大這個大數據集的範圍,我們可以從@lmo得到建議並採取更直接的方法;見:

levels(Time) <- sub("^10", "8", Time) 

時間比較:

require(microbenchmark) 
microbenchmark(factor(sub("^10", "8", Time)), 
       levels(Time) <- sub("^10", "8", Time)) 

Unit: microseconds 
           expr min  lq  mean median 
     factor(sub("^10", "8", Time)) 56.254 57.9945 77.58347 58.6855 
levels(Time) <- sub("^10", "8", Time) 27.932 28.9770 32.59209 30.4035 
+1

您也可以直接使用因子水平:'levels(Time)< - sub(「^ 10」,「8」,Time)'。在這種情況下,效率並不重要,但是如果矢量很大並且有很多重複值,我相當確信在這些級別上的操作將顯着加快。正則表達式的功能也足夠聰明,可以自動執行此操作。 – lmo