有没有一种基本的方法来用标签取代R的整数级别编码?

时间:2018-04-20 22:04:00

标签: r r-factor

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

鉴于

> 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>

我想用新的非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>

作为输出。

非常感谢。

3 个答案:

答案 0 :(得分:3)

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>

答案 1 :(得分:2)

解决方案是使用dplyr::coalesceNA中的new替换为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")))

答案 2 :(得分:1)

这使用整数值作为“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>