使用R

时间:2016-12-01 21:42:34

标签: r if-statement replace

我已经完成了几个答案并尝试了以下方法,但每个都会产生错误或不想要的结果:

这里是数据:

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的新手,但这不应该那么难:(

4 个答案:

答案 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)

作为小鸭丑,但工作:)