我有一个相当基本的问题。我在列中有几个值,我想替换一个值,例如:
a<-data.frame(T=LETTERS[5:20],V=rnorm(16,10,1))
我想在T中为“AB”更改所有“E”,“S”,“T”,所以我试过
a[a$T==c("E","S","T")]<-"AB"
它给了我几个警告,并最终将所有替换为“AB”
我认为它与关卡和关卡的标签有关,但我无法仅替换某些值,我必须重新标记每个。对不起,很抱歉,感谢您的帮助!
答案 0 :(得分:6)
您可以使用库recode()
中的函数car
来更改因子的值。
library(car)
a$T<-recode(a$T,"c('E','S','T')='AB'")
如果需要用不同的其他值替换不同的值,则可以在一个函数调用中写入所有语句。
recode(a$T,"c('E','S','T')='AB';c('F','G','H')='CD'")
答案 1 :(得分:4)
这将维护您的数据结构(这是您猜到的一个因素):
x <- levels(a$T)
levels(a$T) <- ifelse(x %in% c("E","S","T"), "AB", x)
或
levels(a$T)[levels(a$T) %in% c("E","S","T")] <- "AB"
编辑:如果你有很多这样的替代品,那就有点复杂但并非不可能:
from <- list(c("E","S","T"), c("J", "K", "L"))
to <- c("AB", "YZ")
find.in.list <- function(x, y) match(TRUE, sapply(y, `%in%`, x = x))
idx.in.list <- sapply(levels(a$T), find.in.list, from)
levels(a$T) <- ifelse(is.na(idx.in.list), levels(a$T), to[idx.in.list])
a$T
# [1] AB F G H I YZ YZ YZ M N O P Q R AB AB
# Levels: AB F G H I YZ M N O P Q R
答案 2 :(得分:0)
你真的想要那里的因素吗?
如果不是(我认为你没有)做options(stringsAsFactors=FALSE)
所以它比那简单得多...... =&gt; a[a$T %in% c("E","S","T"),"T"]<-"AB"