【问题标题】:if statement with three outcomes具有三个结果的 if 语句
【发布时间】:2019-10-21 12:59:00
【问题描述】:

我想创建一个新列,其中的值取决于其他列。 三种可能的结果

  1. 距离
  2. 距离
  3. 距离 > Max_disp = Max_disp

我曾尝试使用具有多个结果的 if 语句,但收到警告。

警告信息: 1: 如果 (Noord_2015_moved$Distance 1 并且只使用第一个元素 2: 如果 (Noord_2015_moved$Distance 1,并且只使用第一个元素

实际上它只打印“Max_disp”。

这是我用过的代码

if (Noord_2015_moved$Distance < Noord_2015_moved$Min_disp) {
  0
} else if (Noord_2015_moved$Distance < Noord_2015_moved$Max_disp) {
  Noord_2015_moved$Distance
} else {
  Noord_2015_moved$Max_disp
}

我也尝试过在三个单独的步骤中运行它,但是我遇到了一个问题,我不知道如何告诉 R 只应用 df$column 的一部分,因为现在我得到了错误

要替换的项目数不是替换长度的倍数

Noord_2015_moved <- mutate(Noord_2015_moved, Actual_disp = ifelse(Distance < Min_disp, 0, NA))
Noord_2015_moved$Actual_disp[Noord_2015_moved$Distance < Noord_2015_moved$Max_disp] <- Noord_2015_moved$Distance
Noord_2015_moved$Actual_disp[is.na(Noord_2015$Actual_disp)] <- Noord_2015_moved$Max_disp

这是我的数据

'data.frame':   301 obs. of  15 variables:
 $ Transmitter: Factor w/ 18 levels "A69-1601-22313",..: 1 1 1 1 1 1 1 2 2 2 ...
 $ Date       : Date, format: "2015-03-03" "2015-03-08" "2015-03-11" "2015-05-18" ...
 $ Date_time  : Factor w/ 279544 levels "1-03-15 0:00",..: 198302 258702 18684 85140 190788 182641 208718 26315 198759 205744 ...
 $ Receiver   : Factor w/ 17 levels "uitzetpunt 1-noord",..: 8 5 8 5 6 7 6 8 5 8 ...
 $ Station    : Factor w/ 17 levels "10","11","12",..: 15 12 15 12 13 14 13 15 12 15 ...
 $ Traject    : Factor w/ 53 levels "","10-10","10-9",..: 53 50 41 50 40 44 45 53 50 41 ...
 $ Interval   : num  83.4 12.7 42.6 25.2 217.4 ...
 $ Distance   : num  1540 6480 6480 6480 4690 4220 4220 1540 6480 6480 ...
 $ Min_speed  : num  0.02 0.51 0.15 0.26 0.02 0.73 0.52 0.01 0.02 0.02 ...
 $ Min_speed2 : num  0.00556 0.14167 0.04167 0.07222 0.00556 ...
 $ Length     : int  47 47 47 47 47 47 47 45 45 45 ...
 $ Activity   : chr  "Low" "Low" "Low" "Low" ...
 $ Moved      : chr  "Yes" "Yes" "Yes" "Yes" ...
 $ Min_disp   : num  160 4080 1200 2080 160 5840 4160 80 160 160 ...
 $ Max_disp   : num  240 6120 1800 3120 240 8760 6240 120 240 240 ...

【问题讨论】:

标签: r if-statement


【解决方案1】:

if() 未矢量化。它适用于单一条件,而不是整个向量。这就是警告 “条件的长度 > 1 并且只会使用第一个元素” 告诉您的内容。您可以为此使用if(),但您需要将其放入for 循环中以一次检查每一行。可行,但效率不高。

ifelseif的矢量化版本,适用于此类问题。对于这样的事情,你可能会嵌套 2 个 ifelses:

Noord_2015_moved$Actual_disp = ifelse(
  Noord_2015_moved$Distance < Noord_2015_moved$Min_disp, 0, 
  ifelse(Noord_2015_moved$Distance < Noord_2015_moved$Max_disp, Noord_2015_moved$Distance,
    Noord_2015_moved$Max_disp
  ))

我看到你有一个 mutate。如果您使用dplyr,则可以使用mutate,它会在数据框中添加一列,这意味着您无需输入数据框的名称即可引用现有列。这段代码相当于我上面的代码:

Noord_2015_moved = Noord_2015_moved %>% mutate(
  Acutal_disp = ifelse(Distance < Min_disp, 0, 
    ifelse(Distance < Max_disp, Distance, Max_disp)
  )
)

【讨论】:

    【解决方案2】:

    除了多次使用 to ifelse,您还可以使用dplyr::case_when,它以最简洁的方式处理多个结果:

    Noord_2015_moved = Noord_2015_moved %>% mutate(
      Acutal_disp = case_when(
        Distance < Min_disp ~ 0,
        Distance < Max_disp ~ Distance,
        Distance > Max_disp ~ Max_disp,
        TRUE ~ NA_real_
      )
    )
    

    这是一个简短的reference

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 2015-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多