我已经完成了几个答案并尝试了以下方法,但每个都会产生错误或不想要的结果:
这里是数据:
Network Campaign
Moburst_Chartboost Test Campaign
Moburst_Chartboost Test Campaign
Moburst_Appnext unknown
Moburst_Appnext 1065
我想替换"测试广告系列"用" 1055"每当"网络" ==" Moburst_Chartboost"。我意识到这应该很简单,但要尝试这些:
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)
})
这会在行&#34;广告系列&#34;中转换所有4个值进入&#34; 1055&#34;即使在条件不满足的情况下也会过度运行那些
也是这样:
dataset$Campaign[which(dataset$Network == 'Moburst_Chartboost')] <- 1055
产生此错误,并替换了&#34;广告系列&#34;的前两行中的值。与NA:
Warning message:
In `[<-.factor`(`*tmp*`, which(dataset$Network == "Moburst_Chartboost"), :
invalid factor level, NA generated
在这里挠我的头。 R的新手,但这不应该那么难:(
答案 0 :(得分:0)
尝试以下
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],您将处理数据框的整个向量,从而导致您提到的错误/警告。
请注意,我向stringsAsFactors = F
函数添加了read.csv()
,以确保字符串确实被解释为字符串而不是因子。使用因素会导致像
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'
答案 1 :(得分:0)
在您第一次尝试时,如果您只想更改第二列,则会尝试迭代所有列。
在您的第二列中,您尝试将值“1055”分配给所有第二列。
考虑它的方法是if if else,如果满足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
答案 2 :(得分:0)
您也可以尝试使用dataset$Campaign[dataset$Campaign=="Test Campaign"]<-1055
来避免使用循环和ifelse
语句。
dataset
dataset <- data.frame(Network = c("Moburst_Chartboost", "Moburst_Chartboost",
"Moburst_Appnext", "Moburst_Appnext"),
Campaign = c("Test Campaign", "Test Campaign",
"unknown", 1065))
答案 3 :(得分:0)
谢谢你的帮助!虽然不优雅,但是因为昨晚睡觉时我和我徘徊,所以我决定尝试用一些丑陋的代码来打击它,但它也有效 - 只是作为一种解决方法......分成两个数据帧,替换所有值然后绑定回来...
# 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)
作为小鸭丑,但工作:)