2017-09-02 120 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