【问题标题】:With ifelse can I create range and have a blank output if if it's false so I can create another ifelse使用 ifelse 我可以创建范围并在它为 false 时有一个空白输出,这样我就可以创建另一个 ifelse
【发布时间】:2021-02-03 15:23:23
【问题描述】:

我在名为 x 和 y 的 2 个不同向量中有坐标。我想创建第三个变量,告诉他们在哪个 cadran(季度)中。使用我的 ifelse 语句,我无法确定使用范围作为示例 x 将是 25>x>0 和 25>y>0 而不仅仅是 x>0 & y>0 。另外,因为我想用多个 cadran 创建这个变量,所以我想有多个不会相互擦除的 ifelse 语句。所以最后我的第三列给了我这对 x 和 y 中的每一个的 cadran

到目前为止,这是我的代码,我在这里有点障碍

library(dplyr)

x <- c(3,-2, 35, -4, 34, 20, 45)
y <- c(0, 2, 33, -4, 50, 30, 10)

df <- cbind.data.frame(x, y)
df

#Creating  a third variable reacting to coordinate
df$quart <-ifelse(df$x>0 & df$y>0, "quart1", NA)
df$quart <-ifelse(df$x<0 & df$y<0, "quart2", NA)
df

感谢您的帮助

【问题讨论】:

  • case_when 来自dplyr 包和fcase 来自data.table - 你可能会发现这很有用。
  • Case_when 做得很好,谢谢。

标签: r dataframe if-statement


【解决方案1】:

简单的方法

您可以在同一个连词中使用多个ifelse(),一开始可能看起来难以概括,但使用对您有意义的缩进样式可以让您有所收获。

#Creating  a third variable reacting to coordinate

df$quart <- ifelse(
  df$x<0 & df$y<0,
  "quart3",
  ifelse(
    df$x<25 & df$y<25,
    "quart2",
    ifelse(
      df$x<50 & df$y<50,
      "quart1",
      "other"
    )
  )  
)

请注意,在这种方法中,如果 X 和 Y 等于 0、25、50 或 >50,则 quart = "other"。考虑使用&lt;= 而不是&lt;

提高可读性

我建议您使用dplyr,以便于阅读。

library(dplyr)

df <- data.frame(
  x = c(3,-2, 35, -4, 34, 20, 45),
  y = c(0, 2, 33, -4, 50, 30, 10)
)

df <- mutate(
  df,
  quart = ifelse(
    x < 0 & y < 0,
    "quart3",
    ifelse(
      x < 25 & y < 25,
      "quart2",
      ifelse(
        x < 50 & y < 50,
        "quart1",
        "other"
      )
    )  
  )
)

使用 mutate 的优点是导航变量(列)非常容易,因为每一行都是独立处理的,而不是处理整个 x 和 y 向量。如果您需要使用不处理具有多个值的向量的函数,这会有所不同。

在阅读了OP评论和OP答案后,我更新了答案。

【讨论】:

  • 谢谢。但是,我想创建更多的 cadran 并有“quart1”,其中 x 介于 50 和 25 (50>x>25) 之间,y 相同,这可能吗?
  • 对不起,我误解了你的问题!我现在已经根据您的评论和答案更新了我的答案。请让我知道我是否正确或错误地解释了您的意图!
  • 两种方式现在都可以解决我的问题。感谢您的帮助
【解决方案2】:

使用 case_when 对我来说是最简单的方法。感谢您的 cmets/解决方案

df <- data.frame(
  x = c(3,-2, 35, -4, 34, 20, 45),
  y = c(0, 2, 33, -4, 50, 30, 10)
)

df

df %>% 
  mutate(category = case_when(
    x > 25 & y >25   ~ "q1",
    x > 0 & y > 0   ~ "q2",
    x < 0 & y < 0 ~ "q3", 
    TRUE ~ "other"
  )
  )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多