如何使用 forloop 而不是 ifelse

How to use forloop instead of ifelse

提问人:Seyma Kalay 提问时间:10/2/2022 最后编辑:s_baldurSeyma Kalay 更新时间:10/2/2022 访问量:70

问:

我在下面有示例数据,想用 .提前非常感谢。for loopifelse

df <- data.frame(Time = 0:24)

df$TimeBlock <- ifelse( 0 < df$Time & df$Time <= 6, "Night",
                        ifelse( 6 < df$Time & df$Time <= 12, "Morning",
                                ifelse( 12 < df$Time & df$Time <= 18, "Afternoon", "Evening")))
r for 循环 if 语句 数据操作

评论


答:

3赞 s_baldur 10/2/2022 #1

以下是使用 for 循环的一种方法:

df$ltb = ""
for (i in seq_len(nrow(df))) {
  if      (0  < df$Time[i] && df$Time[i] <= 6)  df$ltb[i] = "Night"
  else if (6  < df$Time[i] && df$Time[i] <= 12) df$ltb[i] = "Morning"
  else if (12 < df$Time[i] && df$Time[i] <= 18) df$ltb[i] = "Afternoon"
  else                                          df$ltb[i] = "Evening"
}

但更 R'ish 的是:

df$ltb = 
  cut(
    df$Time, 
    c(-Inf, 0, 6, 12, 18, 24), 
    labels = c("Evening", "Night", "Morning", "Afternoon", "Evening")
  )
1赞 SSDN 10/2/2022 #2
cal_time <- function(dtime){
    if      (0  < dtime && dtime <= 6)  output = "Night"
    else if (6  < dtime && dtime <= 12) output = "Morning"
    else if (12 < dtime && dtime <= 18) output = "Afternoon"
    else                                          output = "Evening"
    output
}

df$TimeBlock = NA
for(i in 1:nrow(df)){
  df[i,]$TimeBlock <- cal_time(dtime = df$Time[I])
}

更好的替代方法:

cal_time <- function(dtime){
    if      (0  < dtime && dtime <= 6)  output = "Night"
    else if (6  < dtime && dtime <= 12) output = "Morning"
    else if (12 < dtime && dtime <= 18) output = "Afternoon"
    else                                          output = "Evening"
    output
}
df <- data.frame(Time = 0:24)
df$TimeBlock = apply(df, 1, cal_time)