2013-06-20 204 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