【问题标题】:Error when trying to use switch() to return a NULL value in if else statement in R尝试使用 switch() 在 R 中的 if else 语句中返回 NULL 值时出错
【发布时间】:2020-05-16 10:08:30
【问题描述】:

我有一个结果为空的 if 语句,但在尝试运行代码时不断收到错误消息。

例如,我的 df 有两个数值列,值范围从 0 到 100。我想根据以下伪代码创建一个新列:

ifelse (df$column1 == 0, NULL, df$column2/df$column1)

我已经尝试过switch(),但是当我这样做时,我收到了一个错误: EXPR 必须是长度为 1 的向量

切换代码:

df$column3 = switch((df$column1[i] != 0) + 1, 
             NULL, 
             df$column2/df$column1)

当我尝试将其放入 for 循环以分别查看每条记录时,我得到另一个错误(类似于我尝试 ifelse() 时遇到的错误: df$column3[i]

for循环:

for (i in 1:nrow(df)) {
             n = switch((df$column1[i] != 0) + 1, 
               NULL, 
               df$column2/df$column1)
             df$column3[i] = n 

      }

如果不满足某些条件,我如何调整它以在列中设置 NULL。

任何建议都会非常有帮助!谢谢!

【问题讨论】:

  • NULL 在大多数向量中不是合法值。请改用NA

标签: r dataframe if-statement null


【解决方案1】:

看来你的伪代码基本就在那里了?

以下是 R 附带的 iris 数据集的示例:

iris$newcol = ifelse(
  iris$Sepal.Length < 5, 
  NA_real_, 
  iris$Sepal.Length/iris$Sepal.Width
  )
iris

【讨论】:

  • 谢谢!抱歉,我没有提到我有两种情况。这适用于第一个,但是当我尝试使用第二个将日期作为“其他”结果时,我在该字段中得到了一个非日期。这段代码的问题是,因为我使用的是日期,所以字段的格式被转换为 null 的字符 b/c,因此“else”部分中的日期就像 18345。我尝试了 fifelse,但我得到 NA_real_ 不是同一个类的错误。我坚持将字符“日期”转换为可读日期。当我尝试使用 as.Date() 将该字段转换为日期时,我收到一个原始错误。
  • 也许您只想使用逻辑NA?如果您使用逻辑类型,R 将尝试为您强制指定缺失值的类型。我习惯于指定类型,但您不必这样做。 library('lubridate'); dates = c( '2020-01-01', '2020-01-15', '2020-01-30' ); dates = ymd(dates); dates[3] = NA
  • 谢谢!这是我的代码: df$newDateCol = ifelse(df$anotherCol == "Yes", , Sys.Date()) 。这是我尝试过 fifelse、切换和重新排列它们等的地方。当我尝试在 null 部分中使用 NA 时,我得到:18292 ... no' 是 double 类型。
  • 也许只是先用Sys.Date() 填充列然后替换? df = data.frame( x = sample( c('Yes', 'No', NA), size = 10, replace = TRUE ), y = Sys.Date() ); df$y[which(df$x == 'Yes')] = NA
  • 完美!!我认为这会奏效!!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 2020-11-06
  • 2023-03-15
  • 2020-08-20
  • 1970-01-01
相关资源
最近更新 更多