如何替换数据框中的特定单词

时间:2015-03-17 09:09:31

标签: r

category.1 <- c("TM","TM","CPA","TM","CPC")
category.2 <- c("LS","LS","DSP","DSP","AF")
platform <- c("facebook","facebook","yahoo","google","google")

dat <- data.frame(platform,category.1,category.2)
dat
  platform category.1 category.2
1 facebook         TM         LS
2 facebook         TM         LS
3    yahoo        CPA        DSP
4   google         TM        DSP
5   google        CPC         AF

当category.1为'TM'且category.2'LS'时,我想将'LS'替换为'LS1'

      platform category.1 category.2
    1 facebook         TM         LS1
    2 facebook         TM         LS1
    3    yahoo        CPA        DSP
    4   google         TM        DSP
    5   google        CPC         AF

我试过这种方式,它的返回错误。

 dat$category.1[dat$category.1=='TM'& dat$category.2=='LS',] <- 'LS1'

感谢您的阅读。

4 个答案:

答案 0 :(得分:6)

另一种方法;使用dplyrifelse基函数。

> library(dplyr)
> dat <-
    dat %>%
    mutate(category.2 = ifelse(category.1 == "TM" & category.2 == "LS",
           "LS1",
           as.character(category.2)))


> dat
  platform category.1 category.2
1 facebook         TM        LS1
2 facebook         TM        LS1
3    yahoo        CPA        DSP
4   google         TM        DSP
5   google        CPC         AF

答案 1 :(得分:4)

您可以在创建数据集时设置stringsAsFactors = FALSE

dat <- data.frame(platform,category.1,category.2, stringsAsFactors = FALSE)     

然后你可以使用你的代码,只需删除这样的逗号

dat$category.2[dat$category.1=='TM'& dat$category.2=='LS'] <- "LS1"

答案 2 :(得分:3)

如果您想要一种非常有效的条件替换方法,请查看data.table包及其二进制搜索/替换参考

library(data.table)
setkey(setDT(dat), category.1, category.2)
dat[J("TM", "LS"), category.2 := "LS1"][]
#    platform category.1 category.2
# 1:    yahoo        CPA        DSP
# 2:   google        CPC         AF
# 3:   google         TM        DSP
# 4: facebook         TM        LS1
# 5: facebook         TM        LS1

setDT会转换为data.table个对象。 setkey键入数据以执行二进制连接。 J()执行实际的二进制连接。 :=通过引用执行分配并更新category.1

虽然你的数据集不是很大,但你可以做到

dat[category.1 == "TM" & category.2 == "LS", category.2 := "LS1"][]

一些略大的数据集的基准测试(我没有测试基础,因为你需要转换为字符类才能使其工作)

library(data.table)
library(dplyr)
library(microbenchmark)

dat2 <- data.frame(lapply(dat, rep, 1e5))
dat3 <- copy(dat2)
dat4 <- copy(dat2)

dplyrfunc <- function(x) {
  x <- x %>%
    mutate(category.2 = 
          ifelse(category.1 == "TM" & category.2 == "LS",
          "LS1", as.character(category.2)))
  x
}

data.tablefunc1 <- function(x){
  setkey(setDT(x), category.1, category.2)
  x[J("TM", "LS"), category.2 := "LS1"][]
}

data.tablefunc2 <- function(x){
  setDT(x)[category.1 == "TM" & category.2 == "LS", category.2 := "LS1"][]
}

## Unit: milliseconds
##                  expr        min         lq      mean     median         uq       max neval
##       dplyrfunc(dat2) 277.261833 291.647719 313.76279 302.337902 335.703250 401.38212   100
## data.tablefunc1(dat3)   5.371047   5.905744   8.12169   6.904871   8.266383  59.83116   100
## data.tablefunc2(dat4)  31.980348  32.870719  38.26239  34.745612  39.309186  88.91202   100

答案 3 :(得分:1)

您可以使用revalue包中的plyr

library(plyr)
dat$category.2 <- revalue(dat$category.2, c("LS" = "LS1"))
dat

  platform category.1 category.2
1 facebook         TM        LS1
2 facebook         TM        LS1
3    yahoo        CPA        DSP
4   google         TM        DSP
5   google        CPC         AF