有没有一种基本的方法可以用标签替换 R 的级别整数编码?

Is there an elementary way to replace R's integer encoding of levels with labels?

这是我在这里的第一个问题,所以我希望它适合这个论坛。非常感谢任何关于如何改进问题或标题的建议。

给出

> experiment <- data.frame(old=factor(c("z","z","z","z","z"),levels=c("x","y","z")),
new=factor(c("y","z","x",NA,NA),levels=c("x","y","z")))
> experiment
  old  new
1   z    y
2   z    z
3   z    x
4   z <NA>
5   z <NA>

我想在新的不适用时用新的更新旧的。命令

> experiment$old <- ifelse(is.na(experiment$new),experiment$old,experiment$new)

似乎是我想要的,除了我得到的是 R 的级别整数编码而不是标签本身:

> experiment
  old  new
1   2    y
2   3    z
3   1    x
4   3 <NA>
5   3 <NA>

是否有一些基本的方法可以将 R 的级别整数编码转换回标签?我希望得到

> experiment
  old  new
1   y    y
2   z    z
3   x    x
4   z <NA>
5   z <NA>

改为输出。

非常感谢。

ifelse() 不会工作,因为它会掉落属性。这个很好,因为列共享因子水平。我们可以使用 within() 如下:

within(experiment, { old[!is.na(new)] <- new[!is.na(new)] })
#   old  new
# 1   y    y
# 2   z    z
# 3   x    x
# 4   z <NA>
# 5   z <NA>

一个解决方案是用dplyr::coalescenew中的NA替换为old对应的值,然后赋值回old

library(dplyr)

experiment %>% mutate(old = coalesce(new, old))

#   old  new
# 1   y    y
# 2   z    z
# 3   x    x
# 4   z <NA>
# 5   z <NA>

数据:

experiment <- data.frame(old=factor(c("z","z","z","z","z"), levels=c("x","y","z")),
                     new=factor(c("y","z","x",NA,NA),levels=c("x","y","z")))

这使用整数值作为 `levels(experiment$old) 的索引:

> experiment$old <- levels(experiment$old)[
                       ifelse(is.na(experiment$new),experiment$old,experiment$new)] 
> experiment
  old  new
1   y    y
2   z    z
3   x    x
4   z <NA>
5   z <NA>