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'
感谢您的阅读。
答案 0 :(得分:6)
另一种方法;使用dplyr
和ifelse
基函数。
> 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