我希望加快一个循环,根据不同的条件为行分配评级。根据不同的条件分配六个不同的等级(0到5)。我尝试使用for循环和每个条件的if语句来做这个,但是要经历数百万行,这实际上是没有选择的。我甚至不知道完成需要多长时间。它在我手动停止之前已经运行了几个小时。
规则是:
Rating 0: if df$Bounce >= 75 and df$time<10 and df$view<1
Rating 1: if df$Bounce >= 75 or df$Assist<1
Rating 2: if df$Bounce < 75 and df$Assist<2
Rating 3: if df$Bounce < 75 and df$Assist<3
Rating 4: if df$Bounce < 75 and df$Assist<=4
Rating 5: if df$Bounce < 75 and df$Assist>=5
我的脚本中有更多这些'慢'语句,所以这个问题的答案将加速很多过程!
一个小示例数据集
tc <- textConnection('
belongID uniqID Bounce Assist time view
1 101 90 10 7 0
1 102 75 0 8 10
2 103 10 30 4 2
2 104 50 3 1 10
2 105 74 2 5 4
3 106 5 1 2 8 ')
df <- read.table(tc,header=TRUE)
结果应该导致相同的数据集具有新的列评级和根据规则的评级:
belongID uniqID Bounce Assist time view Rating
1 101 90 10 7 0 0
1 102 75 0 8 10 1
2 103 10 30 4 2 5
2 104 50 3 1 10 4
2 105 74 2 5 4 3
3 106 5 1 2 8 2
编辑:更改评级1条件!
答案 0 :(得分:3)
这是一个函数中的简单算法,可以满足您的要求。由于这只包含三个规则,因此应该非常快。 (但是,我假设Assist
总是一个整数。)
rating <- function(Bounce, Assist, time, view){
x <- pmin(5, Assist + 1)
x[Bounce >= 75 & time<10 & view<1] <- 0
x[Bounce >= 75 & Assist < 1] <- 1
x
}
within(df, rating <- rating(Bounce, Assist, time, view))
belongID uniqID Bounce Assist time view rating
1 1 101 90 10 7 0 0
2 1 102 75 0 8 10 1
3 2 103 10 30 4 2 5
4 2 104 50 3 1 10 4
5 2 105 74 2 5 4 3
6 3 106 5 1 2 8 2
答案 1 :(得分:2)
不要使用循环:
df$rating <- 999
df[df$Bounce >= 75 & df$time < 10 & df$view<1, "rating"] <- 0
df[df$Bounce >= 75 & df$Assist < 1 & df$rating == 999, "rating"] <- 1
df[df$Bounce < 75 & df$Assist < 2 & df$rating == 999, "rating"] <- 2
df[df$Bounce < 75 & df$Assist < 3 & df$rating == 999, "rating"] <- 3
df[df$Bounce < 75 & df$Assist <= 4 & df$rating == 999, "rating"] <- 4
df[df$Bounce < 75 & df$Assist >= 5 & df$rating == 999, "rating"] <- 5
rating == 999
检查是必需的,因为您的规则不是互斥的。如果它们应该是,那么你的逻辑就会出错。否则,这可确保没有规则覆盖先前的规则。
答案 2 :(得分:1)
试
dumfun<-function(w,x,y,z){
if(w>=75&&x<10&&y<1){return(0)}
if(w>=75&&z<1){return(1)}
if(w<75&&z<2){return(2)}
if(w<75&&z<3){return(3)}
if(w<75&&z<5){return(4)}
if(w<75&&z>5){return(5)}
}
df$Rating<-mapply(dumfun,df$Bounce,df$time,df$view,df$Assist)