【问题标题】:NA values as conditions on a IF statement in RNA 值作为 R 中 IF 语句的条件
【发布时间】:2020-11-06 11:47:02
【问题描述】:

我的目标是根据两个不同日期的值对数据集上的行进行分类。

if(!exists(MY_DATA$Date_1) & exists(MY_DATA$Date_2)) {
  MY_DATA$NEW_COL <- c("Category_1")
} else {
  MY_DATA$NEW_COL <- c("Category_2")
}

但它不起作用,我目前正在尝试简化版本如下:

if(!exists(MY_DATA$Date_1)){
  MY_DATA$NEW_COL <- c("Category_1")
}

但是,这似乎只读取第一行的值,它要么给我一列,所有值为Category_1,要么根本没有列。

我也尝试过使用is.na()is.null()exists()

【问题讨论】:

  • 欢迎来到 SO!请在dput 中包含您的数据示例,以获取reproducible example
  • if 不像您使用它那样被 vecotrized。你想要ifelse 函数:MY_DATA$NEW_COL &lt;- ifelse(!exists(MY_DATA$Date_1),"Category_1","Category_2")
  • exists(MY_DATA$Date_1) 仅在以下情况下才有意义:MY_DATA 正好是一行; Date_1 包含字符串;这些字符串指向本地环境或搜索路径中的变量。否则,也许你需要"Date_1" %in% names(MY_DATA)
  • 另外,在if 子句中使用&amp;(单个)的唯一合适的情况是,如果你将它包装在一些聚合函数中,比如anyall,否则它可能按您的需要工作,但很容易失败。为什么? &amp; 返回一个长度为 0 或更多的逻辑向量,而 if 要求长度正好为 1。

标签: r if-statement null dataset


【解决方案1】:

感谢大家的支持,ifelse 成功了。

以下内容对我有用:

   MY_DATA$NEW_COL  <- c("Category_2")
   MY_DATA$NEW_COL  <- ifelse(!is.na(MY_DATA$Date_1),"Category_1","Category_2")

【讨论】:

    【解决方案2】:

    但是,这似乎只读取第一行的值,它要么给我一列,所有值为Category_1,要么根本没有列。

    这是因为if 语句需要一个长度为 1 的向量。当给定一个长度大于 1 的向量时,它只会读取第一个成员来做出TRUEFALSE 的决定。

    ifelse 函数可以接受向量参数,并将返回一个逻辑向量 TRUE/FALSE。它可能适合您的需求。


    改写原来@r2evans 的一条评论,exists() 的使用是为了检查R 环境中是否已经定义了一个变量。 exists() 接受长度为 1 的字符向量作为参数,否则只会检查第一个成员。

    a = 1
    b = 1
    exists("a")
    [1] TRUE
    
    exists(c("a", "b"))
    [1] TRUE
    
    exists(c("ab", "a", "b"))
    [1] FALSE
    

    但值得注意的是,exists() 不检查值是否在向量内。如果您尝试检查某个值是否在向量中,则需要运算符 %in%


    解决方案在很大程度上取决于您的精确实施。

    附言这原本是作为评论的,但作为评论太长了。

    【讨论】:

      猜你喜欢
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      相关资源
      最近更新 更多