我使用ifelse语句超过100次,以创建> 100个访问类别,如下所示。
df<-data.frame(visit_time=c(12,20,70,100),city=c("X","X","X","X"))
df$visit_category<-ifelse(df$visit_time>=0 & df$visit_time<12 ,"0-12",ifelse(df$visit_time>=12 & df$visit_time <20,"12-20",ifelse(df$visit_time>=20 & df$visit_time <50,"20-50",ifelse(df$visit_time>=50 & df$visit_time <100,"50-100",">100"))))
如示例数据[访问类别列]中所示,示例数据有4个不同的值,并且需要在实际数据上创建> 50个不同的类别。
当我尝试创建50个以上的类别时,我在R中收到这样的错误[是否有研究n发现R不允许同时包含50个以上的iflese语句!!,不知道其是否正确。 ]
错误:出现意外的“)”
错误:第42行的contextstack溢出
除了在R中使用ifelse语句以外,还有没有更好的方法来创建> 50个不同的访问类别值?
答案 0 :(得分:1)
您可以使用函数cut()
及其参数breaks =
来定义自己的间隔。
library(dplyr)
library(forcats)
df %>%
mutate(
category = visit_time %>% cut(breaks = c(12, 20, 50, 100, 1e6), include.lowest = T, right = F),
category = fct_recode(category, '100+' = '[100,1e+06]')
)
visit_time city category
1 12 X [12,20)
2 20 X [20,50)
3 70 X [50,100)
4 100 X 100+
答案 1 :(得分:0)
如果您不能使用cut()
函数,一种替代方法是使用带有 if语句的循环来测试存储桶的条件,直接使用功能ifelse()
的说明。
df$category <- NA
breaks_limits <- c(0, 12, 20, 50, 100, 1e6)
breaks_labels <- c('[0-12]', '[12-20]', '[20-50]', '[50-100]', '100+')
breaks_num <- length(breaks_labels)
for(i in 1:nrow(df))
{
for(b in 1:breaks_num)
{
if(df$visit_time[i] >= breaks_limits[b] & df$visit_time[i] < breaks_limits[b+1])
df$category[i] <- breaks_labels[b]
}
}