如何使用dplyr创建需要50个以上不同因子值的列

时间:2019-01-30 18:47:43

标签: r if-statement dplyr

我使用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个不同的访问类别值?

2 个答案:

答案 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]
  }
}
相关问题