【问题标题】:R: combined/ nested if_else statementR:组合/嵌套if else语句
【发布时间】:2020-06-17 15:01:36
【问题描述】:

谁能告诉我我在这里做错了什么。 尝试根据两列的值在 R::dplyr 中使用组合的 if_else 语句。 下面的代码不起作用 - 只给出 X+90?

链接到 csv:https://www.dropbox.com/s/nmyiwdazsvs7wko/VideoTrack_ed.csv?dl=0

library(readr)
library(dplyr)

VidTrack <- read_csv("VideoTrack_ed.csv")

x <- VidTrack$course

Perp <- if_else(("R" %in% VidTrack$Side & VidTrack$course<270), x+90, x-270,
                if_else(("L" %in% VidTrack$Side & VidTrack$course<90), x+270,
                        x-90))
Perp_df <- as.data.frame(Perp)

在 Excel 中是这样的; =IF(AND(H2="R",Z2&lt;270),Z2+90,IF(AND(H2="R",Z2&gt;=270),Z2+270,IF(AND(H2="L",Z2&lt;90),Z2+270,Z2-90)))

Column H = VidTrack$Side
Column Z = VidTrack$course

【问题讨论】:

    标签: r if-statement dplyr


    【解决方案1】:

    我们可以使用case_when 列出所有要按顺序执行的条件。

    library(dplyr)
    
    VidTrack %>%
       mutate(new_column = case_when(
                           Side == "R" & course < 270 ~ course + 90, 
                           Side == "R" & course >= 270  ~ course - 270, 
                           Side == "L" & course < 270 ~ course + 270, 
                           Side == "L" & course >= 90 ~ course - 90))
    

    【讨论】:

    • 无论是 Side == R 还是 Side == L,该解决方案都会创建两列具有值的列。如何将其变成一列。谢谢
    • @Jock 你能用语言解释你想要做什么吗?因为我不懂 excel 语法,而且我对你的 R 代码感到困惑。 if_else 的语法是 if_else(condition, true, false) 。我认为首先conditionSide == "R" &amp; course&lt;270,当它是真的course+90 或者course-270。你能澄清一下吗?
    • 没问题。我需要嵌套的 if_else 语句。如果Side == "R" &amp; course &lt; 270 则新列中的值为course + 90。如果Side == "R" &amp; course &gt;= 270,则新列值为course-270,如果Side == "L" &amp; course &lt;90,则新列值为course + 270,如果Side == "L" &amp; course &gt;= 90,则新列值为course-90。感谢您的帮助。
    • @Jock 谢谢你的解释。我已经更新了答案,请现在看看,让我知道它是否适合你。
    • dplyr::case_when 正是我所需要的。谢谢
    【解决方案2】:

    我无法打开文件,所以帮不上什么忙。但是,不应该是这样吗:

    Perp <- if_else((VidTrack$Side == "R" & VidTrack$course < 270), x+90, x-270,
                    if_else((VidTrack$Side == "L" & VidTrack$course < 90), x+270,
                            x-90))
    

    【讨论】:

    • 返回错误:错误:true 的长度必须为 21537(condition 的长度)或一,而不是 9522 运行 rlang::last_error() 以查看错误发生的位置。
    • 抱歉,我没有数据,无法查询
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多