![](/img/trans.png)
[英]Return new column z based on min of column x, if column y = value in R
[英]replacing a value in column X based on columns Y with R
我已经经历了几个答案,并尝试了以下方法,但每个方法都会产生错误或不需要的结果:
这是数据:
Network Campaign
Moburst_Chartboost Test Campaign
Moburst_Chartboost Test Campaign
Moburst_Appnext unknown
Moburst_Appnext 1065
每当“网络” ==“ Moburst_Chartboost”时,我想将“测试活动”替换为“ 1055”。 我意识到这应该非常简单,但可以尝试以下方法:
dataset = read.csv('C:/Users/User/Downloads/example.csv')
for( i in 1:nrow(dataset)){
if(dataset$Network == 'Moburst_Chartboost') dataset$Campaign <- '1055'
}
这将产生一个错误:警告消息:
1: In if (dataset$Network == "Moburst_Chartboost") dataset$Campaign <- "1055" :
the condition has length > 1 and only the first element will be used
2: In if (dataset$Network == "Moburst_Chartboost") dataset$Campaign <- "1055" :
the condition has length > 1 and only the first element will be used
etc.
然后我尝试了:
within(dataset, {
dataset$Campaign <- ifelse(dataset$Network == 'Moburst_Chartboost', '1055', dataset$Campaign)
})
这样,即使不满足条件,也可以通过运行“活动”行中的所有4个值将其变为“ 1055”
还有这个:
dataset$Campaign[which(dataset$Network == 'Moburst_Chartboost')] <- 1055
会产生此错误,并将“广告系列”的第一两行中的值替换为NA:
Warning message:
In `[<-.factor`(`*tmp*`, which(dataset$Network == "Moburst_Chartboost"), :
invalid factor level, NA generated
在这里挠头。 R的新手,但这不应该那么难:(
尝试以下
dataset = read.csv('C:/Users/User/Downloads/example.csv', stringsAsFactors = F)
for( i in 1:nrow(dataset)){
if(dataset$Network[i] == 'Moburst_Chartboost') dataset$Campaign[i] <- '1055'
}
看来您忘记了索引变量。 如果没有[i],您将处理数据帧的整个向量,从而导致您提到的错误/警告。 请注意,我在read.csv()
函数中添加了stringsAsFactors = F
以确保字符串确实被解释为字符串而不是因素。 使用因素会导致这样的错误
In `[<-.factor`(`*tmp*`, i, value = c(NA, 2L, 3L, 1L)) :
invalid factor level, NA generated
另外,您可以不使用for
循环而执行以下操作:
idx <- which(dataset$Network == 'Moburst_Chartboost')
dataset$Campaign[idx] <- '1055'
在此, idx
是一个矢量,其中包含Network
的值为'Moburst_Chartboost'
在第一次尝试中,当您只想更改第二列时,您尝试遍历所有列。
在第二个步骤中,您尝试将值“ 1055”分配给所有第二列。
考虑它的方式就好像是其他情况一样,如果满足col 1中的条件,则col 2会更改,否则保持不变。
dataset <- data.frame(Network = c("Moburst_Chartboost", "Moburst_Chartboost",
"Moburst_Appnext", "Moburst_Appnext"),
Campaign = c("Test Campaign", "Test Campaign",
"unknown", "1065"))
dataset$Campaign <- ifelse(dataset$Network == "Moburst_Chartboost",
"1055",
dataset$Campaign)
head(dataset)
Network Campaign
1 Moburst_Chartboost 1055
2 Moburst_Chartboost 1055
3 Moburst_Appnext unknown
4 Moburst_Appnext 1065
您也可以尝试使用dataset$Campaign[dataset$Campaign=="Test Campaign"]<-1055
ifelse
以避免使用循环和ifelse
语句。
dataset
在哪里
dataset <- data.frame(Network = c("Moburst_Chartboost", "Moburst_Chartboost",
"Moburst_Appnext", "Moburst_Appnext"),
Campaign = c("Test Campaign", "Test Campaign",
"unknown", 1065))
感谢您的帮助! 不是很优雅,但是由于昨晚睡觉时这困扰我,我决定尝试用一些丑陋的代码来解决这个问题,但是它也可以工作-就像一个解决方法...分离为两个数据帧,替换所有值然后绑定背部...
# subsetting only chartboost
chartboost <- subset(dataset, dataset$Network=='Moburst_Chartboost')
# replace all values in Campaign
chartboost$Campaign <-sub("^.*", "1055",chartboost$Campaign)
#subsetting only "not chartboost"
notChartboost <-subset(dataset, dataset$Network!='Moburst_Chartboost')
# binding back to single dataframe
newSet <- rbind(chartboost, notChartboost)
丑小鸭,但工作:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.