我有一个因子向量。某些值可以重复。这些值事先是未知的,但可以进行排序。例如,
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
}
这是按预期工作的,但我想知道是否有更有效的解决方案。
答案 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