【问题标题】:dplyr if_else Error: `true` must be length x (length of `condition`) or one, not 0 in rdplyr if_else 错误:`true` 必须是长度 x(`condition` 的长度)或 1,而不是 r 中的 0
【发布时间】:2020-06-14 01:12:54
【问题描述】:

我有一个看起来像这样的数据框:

df <- data.frame('Home.Team'=c("Omaha South", "Millard North", "Elkhorn","Elkhorn"),                      
                 'Winner'=c("Omaha South", "Millard North", "Elkhorn","Elkhorn"),
                 'Won By'=c(8,22,4,30),
                 'Away Class'=c("TRUE", "FALSE", "TRUE", "FALSE"))

我正在尝试使用来自dplyr 的条件if_else 创建一个新列/变量。这在过去对我有用,但由于某种原因,它现在给了我一个错误。下面是r代码和错误:

df$'Pre Score' <- 
        if_else(df$`Away Class`=="FALSE", 
        if_else(df$Home.Team==df$Winner, .8 + (df$`Won By`/100) -1, -1.2 - (df$`Won By`/100) -1), 
        if_else(df$Home.Team==df$Winner, .8 + (df$`Won By`/100), -1.2 - (df$`Won By`/100)))

错误:true 的长度必须为 4(condition 的长度)或 1,而不是 0

我已经阅读了与此相关的多个 SO 讨论(exampleexampleexample),但无法将其转化为我的问题的解决方案。它似乎与代码的“如果为真”部分有关。显然它认为这是 1 的长度,而我希望它是 4 的长度,或者适用于所有行。尝试用 case_when 替换 if_else 但也未能成功。

【问题讨论】:

  • 没有直接关系,但为什么你有 true & false 作为字符而不是布尔值?对于调试 ifelse 语句,尤其是像这样嵌套的语句,最好将它们一一分开,看看哪些运行或不运行。另外,您是如何尝试case_when的?

标签: r if-statement dplyr


【解决方案1】:

这应该是一个评论,但结果太混乱了:

您的变量名称中缺少句点 - data.frame 会在您创建带有空格的变量名称的 df 时自动添加这些句点:

if_else(df$`Away.Class`=="FALSE", #Away.Class instead of `Away Class`
             if_else(df$Home.Team==df$Winner, .8 + (df$`Won.By`/100) -1, -1.2 - (df$`Won.By`/100) -1), # Won.By instead of `Won By`
             if_else(df$Home.Team==df$Winner, .8 + (df$`Won.By`/100), -1.2 - (df$`Won.By`/100))) # ditto
[1] 0.88 0.02 0.84 0.10

这就是您的代码导致错误的原因:当您运行 .8 + (df$Won By/100) -1 时,结果为 NULL,因为该列不存在 - 所以列表 TRUE/FALSE 结果的长度为零。 ifelse 需要此列表的长度与您的条件相同(即 4,在这种情况下,每个 TRUE 情况都会获得适当的数据)或 1(在这种情况下,所有 TRUE 结果都将获得相同的输出)。

【讨论】:

  • 谢谢@iod。这会解决上面的问题还是那个和额外的错误?
  • 正如我在示例中所示 - 如果我运行缺少句点的代码,我会得到预期的答案 ([1] 0.88 0.02 0.84 0.10)
猜你喜欢
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 2018-01-28
相关资源
最近更新 更多