問題很簡單。出於某種原因,我想不出一個簡單的解決方案,我不能在網上找到一個解決方案。讓我們假設這是我的數據,其中變量是一個因素:替換要素級別中的元素
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
哪有我做這個?
問題很簡單。出於某種原因,我想不出一個簡單的解決方案,我不能在網上找到一個解決方案。讓我們假設這是我的數據,其中變量是一個因素:替換要素級別中的元素
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
哪有我做這個?
由於@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
您也可以直接使用因子水平:'levels(Time)< - sub(「^ 10」,「8」,Time)'。在這種情況下,效率並不重要,但是如果矢量很大並且有很多重複值,我相當確信在這些級別上的操作將顯着加快。正則表達式的功能也足夠聰明,可以自動執行此操作。 – lmo
這裏有一種方法:'時間< - 因子(分( 「^ 10」, 「8」,時間))'。請注意,這會降低以'10'開頭的先前級別。 –
我應該加一個':'來代替小時不是分鐘,對吧?只需仔細檢查一下。 – user2105555
不,請按原樣嘗試。另外,如果你不想刪除我在第一條評論中提到的關卡,只需使用'sub(。)',不要在其周圍包裹'因子'。 –