我有一個相當基本的問題。我有一列幾個值,我想,以取代單一的一個,例如:替換單個列中的多個值
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」
我認爲這是與水平和層次的標籤,但我不能僅替換一些值,我將不得不重新標記每個值。對不起,麻煩了,謝謝你的幫助!
我有一個相當基本的問題。我有一列幾個值,我想,以取代單一的一個,例如:替換單個列中的多個值
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」
我認爲這是與水平和層次的標籤,但我不能僅替換一些值,我將不得不重新標記每個值。對不起,麻煩了,謝謝你的幫助!
您可以使用庫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'")
這將保持你的數據結構(如你猜的因素):
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有助於瞭解此功能,謝謝! –
...但爲什麼這樣一個不友好的界面(不要責怪你@Didzis,但作者)。我讀了'plyr :: mapvalues',但是我不能在舊版R上測試它。如果有人可以試一試,我想'plyr :: mapvalues(levels(a $ T),c(「E」,「S」,「T」),「AB」)'可能會起作用。 – flodel
@flodel mapvalues將與一些修改mapvalues(a $ T,c(「E」,「S」,「T」),代表(「AB」,3)) –