问题很简单。出于某种原因,我想不出一个简单的解决方案,我不能在网上找到一个解决方案。让我们假设这是我的数据,其中变量是一个因素:替换要素级别中的元素
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(。)',不要在其周围包裹'因子'。 –