R:分配因子水平的有效方式

时间:2015-07-28 17:25:17

标签: r

我有一个因子向量。某些值可以重复。这些值事先是未知的,但可以进行排序。例如,

x1 <- factor(c("A", "C", "C", "A", "B" ), levels=c("A", "B", "C"))
x2 <- factor(c("E", "C", "C", "D", "B" ), levels=c("B", "C", "D", "E"))

我想创建另一个向量,其中每个值都是&#34;最后&#34;,&#34;其他&#34;或者&#34;首先&#34;,这些值对应于第一个或最后一个因子级别。在上述情况下,结果向量y1必须为c("first", "last", "last", "first", "other"),而y2必须为c("last", "other", "other", "other", "first")

目前,我这样做:

f2l <- function(x) {
  x <- as.numeric(x)
  y <- rep("other", length(x))
  y[ x == max(x) ] <- "last"
  y[ x == min(x) ] <- "first"
  y
}

这是按预期工作的,但我想知道是否有更有效的解决方案。

2 个答案:

答案 0 :(得分:3)

您可以使用列表重新分配关卡标签。

x1 <- factor(c("A", "C", "C", "A", "B" ), levels=c("A", "B", "C"))
x2 <- factor(c("E", "C", "C", "D", "B" ), levels=c("B", "C", "D", "E"))

f2l <- function(x){
  levels(x) <- list("first" = levels(x)[1],
                    "other" = levels(x)[-c(1, nlevels(x))],
                    "last" = levels(x)[nlevels(x)])
  x
}

f2l(x1)
f2l(x2)

答案 1 :(得分:1)

除了本杰明的方法,如果你确定等级的数量超过2,你可以使用

f2l <- function(x){
    levels(x) <- c("first",rep("other",length(levels(x))-2),"last");
    x
}

如果你为许多人factors这样做,那么与上述方法相比,本杰明的方法很慢。重复100000次的次数

Benjamin
 user  system elapsed 
26.58    0.00   26.68 

Saksham
user  system elapsed 
17.15    0.08   18.30