2013-06-20 139 views
1

我有一个相当基本的问题。我有一列几个值,我想,以取代单一的一个,例如:替换单个列中的多个值

a<-data.frame(T=LETTERS[5:20],V=rnorm(16,10,1))

,我想改变这一切“E”,“S”,“T” T中为“AB”,所以我试图

a[a$T==c("E","S","T")]<-"AB" 

,这让我多次警告,并最终取代所有以“AB”

我认为这是与水平和层次的标签,但我不能仅替换一些值,我将不得不重新标记每个值。对不起,麻烦了,谢谢你的帮助!

回答

4

您可以使用库car中的功能recode()更改这些因子的值。

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'") 
+0

+1有助于了解此功能,谢谢! –

+1

...但为什么这样一个不友好的界面(不要责怪你@Didzis,但作者)。我读了'plyr :: mapvalues',但是我不能在旧版R上测试它。如果有人可以试一试,我想'plyr :: mapvalues(levels(a $ T),c(“E”,“S”,“T”),“AB”)'可能会起作用。 – flodel

+0

@flodel mapvalues将与一些修改mapvalues(a $ T,c(“E”,“S”,“T”),代表(“AB”,3)) –

3

这将保持你的数据结构(如你猜的因素):

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

+1。这是正确的答案,而不是与角色类混淆。 –

0

你真的想要那里的因素吗? 如果不是(我认为你不这样做)options(stringsAsFactors=FALSE) 所以它比这更简单... =>a[a$T %in% c("E","S","T"),"T"]<-"AB"

+0

如果T是因子(在这种情况下),这将给NA值而不是AB。 –

+0

我拿了由OP给出的样本......它只是工作 – statquant

+0

哦!这是因为我的'options()$ stringAsFactors == FALSE',因为'R.2.12.x'' R'R维护字符串散列表我认为在这些情况下不需要因素...... – statquant