我有一个相当基本的问题。我有一列几个值,我想,以取代单一的一个,例如:替换单个列中的多个值
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)) –