有没有一种基本的方法可以用标签替换 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::coalesce
将new
中的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>
这是我在这里的第一个问题,所以我希望它适合这个论坛。非常感谢任何关于如何改进问题或标题的建议。
给出
> 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::coalesce
将new
中的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>