这是我的第一个问题,所以我希望它适合这个论坛。任何关于如何改进问题或标题的建议都将非常感激。
鉴于
> 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>
作为输出。
非常感谢。
答案 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::coalesce
将NA
中的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>