【问题标题】:Replace elements in factor levels替换因子水平中的元素
【发布时间】:2017-09-03 05:26:01
【问题描述】:

问题很简单。由于某种原因,我想不出一个简单的解决方案,我不能在网上找到一个。假设这是我的数据,其中变量是一个因素:

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 <- factor(sub("^10", "8", Time))。请注意,这将删除以前以 10 开头的级别。
  • 我应该添加一个: 来代替小时而不是分钟,对吧?只是仔细检查。
  • 不,按原样尝试。另外,如果您不想放弃我在第一条评论中提到的级别,请仅使用sub(.),不要将factor 包裹起来。
  • 非常感谢您的回复和额外的反馈。

标签: r


【解决方案1】:

正如@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

回答您的问题:“我应该添加一个 : 来代替小时而不是分钟,对吗?” – 不,你不需要这样做。 sub 参数中的 '^' 表示正则表达式中字符串的开头。所以这只会选择小时。

如果我们需要为大型数据集扩大规模,我们可以听取@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) &lt;- sub("^10", "8", Time)。在这种情况下,效率方面并不重要,但如果向量很大并且有很多重复值,我很确定在级别上进行操作会明显更快。也有可能正则表达式函数足够聪明,可以自动执行此操作。
猜你喜欢
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多