将列中的多个值替换为单个值

问题描述 投票:0回答:4

我有一个相当基本的问题。我在一列中有多个值,我想将其替换为单个值,例如:

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

我想把T中的“E”,“S”,“T”全部改为“AB”,所以我尝试了

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

它给了我几个警告,最后全部替换为“AB”

我认为这与级别和级别标签有关,但我无法仅替换某些值,我必须重新标记每个值。抱歉给您带来麻烦,感谢您的帮助!

r dataframe
4个回答
7
投票

您可以使用库

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

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

1
投票

你真的想要那里的因素吗??? 如果没有(我认为你没有),就做

options(stringsAsFactors=FALSE)
所以它比那简单得多... =>
a[a$T %in% c("E","S","T"),"T"]<-"AB"


0
投票

R Base
解决方案是:

a$T[a$T %in% c("E","S","T")] <- "AB"
© www.soinside.com 2019 - 2024. All rights reserved.