【问题标题】:How can I use if statement in R with multi condition?如何在具有多条件的 R 中使用 if 语句?
【发布时间】:2019-05-21 22:04:06
【问题描述】:

我是 的新手,我对if() 语句有疑问。

我的数据如下:

Var1  Var2
4     2
6     2
5     1
3     3
2     1

我想创建一个名为Var3 的新变量。类似的东西

if Var2 = 1 then do; Var3 = Var1*30; end; else;
if Var2 = 2 then do; Var3 = Var1*4; end; else;
if Var2 = 3 then do; Var3 = Var1*1; end; else;

对创建代码的任何帮助将不胜感激。

【问题讨论】:

  • dplyr::case_when 非常适合。
  • Case-when 逻辑如果你有复杂的表达式是好的,但是 R 也允许你避免一步一步的痛苦的表达式。例如,在这个例子中,这本质上是一个查找表——例如dat$Var1 * c(30, 4, 1)[dat$Var2]

标签: r r dataframe if-statement


【解决方案1】:

1) 开关 使用DF 在最后的注释中重复显示尝试使用switch,如下所示。没有使用任何包。

transform(DF, Var3 = Var1 * sapply(Var2, switch, 30, 4, 1))

给予:

  Var1 Var2 Var3
1    4    2   16
2    6    2   24
3    5    1  150
4    3    3    3
5    2    1   60

请参阅?switch 了解更多信息。

2) 算术 另一种方法是使用算术语句来计算所需的值。这也不使用任何包。

transform(DF, Var3 = Var1 * ((Var2 == 1) * 30 + (Var2 == 2) * 4 + (Var2 == 3) * 1))

2a) 一个变体是:

transform(DF, Var3 = Var1 * outer(Var2, 1:3, "==") %*% c(30, 4, 1))

3) 下标 这也有效:

transform(DF, Var3 = Var1 * c(30, 4, 1)[Var2])

4) 因子 另一种方法是创建一个因子,然后将其转换回数字:

transform(DF, Var3 = Var1 * as.numeric(as.character(factor(Var2, labels = c(30, 4, 1)))))

注意

Lines <- "Var1  Var2
4     2
6     2
5     1
3     3
2     1"
DF <- read.table(text = Lines, header = TRUE)

【讨论】:

  • 感谢您的回答。您在 2) 算术上使用的方法效果很好。我刚刚遇到了一个问题,即我在数据集上找不到 Var3。我尝试使用以下DF$SKM &lt;- transform(DF, Var3 = Var1 * ((Var2 == 1) * 30 + (Var2 == 2) * 4 + (Var2 == 3) * 1)) 找不到Var3。有没有办法让新变量成为数据集的一部分
  • 你需要DF &lt;- transform(...或者你可以给它另一个名字,这样你就不会覆盖原来的。
【解决方案2】:

语法与您列出的类似:

DF$Var3 = with(DF,
  ifelse(Var2 == 1, Var1 * 30,
    ifelse(Var2 == 2, Var1 * 4, 
      ifelse(Var2 == 3, Var1, NA))))

但是一旦你掌握了它们的窍门,其他方法会更快地编写和运行。

【讨论】:

    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多