【问题标题】:replace values in a dataframe with nested ifelse用嵌套的 ifelse 替换数据框中的值
【发布时间】:2020-05-17 13:01:42
【问题描述】:

我需要根据条件替换 data.frame 中的某个值,如下所示:

for (i in 1:nrow(DS)){
  if (DS$Date1[i] == DS$Date2[i]){
    DS$Time2[i] <- DS$Time1[i]
  }else if (DS$Date3[i] == DS$Date2[i]) {
    DS$Time2[i] <- DS$Time3[i]
  }else if (DS$Date4[i] == DS$Date2[i]) {
    DS$Time2[i] <- DS$Time4[i]
  }else {
    DS$Date1[i] <- DS$Date2[i]
  }
}

但 ifelse 条件返回错误: if (condition) { 中的错误:需要 TRUE/FALSE 的缺失值。 你能帮我解决这个嵌套的 ifelse 或其他解决方案吗?

【问题讨论】:

  • 嗨!欢迎来到堆栈溢出。如果您包含有关该问题的所有相关信息,这将对我们有所帮助。什么是DS(data.frame?矩阵?)?错误是什么?
  • 错误是“如果(条件){ 中的错误:需要 TRUE/FALSE 的缺失值”DS 是一个数据帧
  • 你有 NA 吗?在数据中?你想怎么对待他们?请注意,如果您将任何内容与 NA 进行比较,您会得到 NA,而不是 True 或 False 值。
  • 是的,数据中有 NA,但对于最终结果并不重要。如果值匹配,我想根据日期替换时间(如前 3 个 ifelse 语句中)。如果不是,我想用另一个日期替换日期,无论是 NA 还是另一个有效值。
  • 然后看到这个答案:stackoverflow.com/a/49913644/3051715

标签: r for-loop replace


【解决方案1】:

正如 tmrlvi 发布的那样,答案是将 == 替换为 %in%,因为如果数据集中有 NA 语句,它就不会像假装的那样工作。

for (i in 1:nrow(DS)){
  if (DS$Date1[i] %in% DS$Date2[i]){
    DS$Time2[i] <- DS$Time1[i]
  }else if (DS$Date3[i] %in% DS$Date2[i]) {
    DS$Time2[i] <- DS$Time3[i]
  }else if (DS$Date4[i] %in% DS$Date2[i]) {
    DS$Time2[i] <- DS$Time4[i]
  }else {
    DS$Date1[i] <- DS$Date2[i]
  }
}

【讨论】:

    【解决方案2】:

    使用嵌套的ifelse 语句可以做到:

    DS$Time2 <- with(DS, ifelse(Date1 %in% Date2, Time1, 
                           ifelse(Date3 %in% Date2, Time3, 
                             ifelse(Date4 %in% Date2, Time4, Time2))))
    

    要替换Date1,我们可以使用

    inds <-  with(DS, !(Date1 %in% Date2 | Date3 %in% Date2 | Date4 %in% Date2))
    DS$Date1[inds] <- DS$Date2[inds]
    

    【讨论】:

      猜你喜欢
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多