【问题标题】:R Replace <NA> with date, if other columns value isR 用日期替换 <NA>,如果其他列的值是
【发布时间】:2017-05-10 15:54:15
【问题描述】:

假设我有两列,一列位置,一列日期,其中一些缺失。

    City       Date
1   Sheffield  19/05/1985
2   Sheffield  21/06/1986
3   Sheffield  <NA>
4   Newcastle  14/07/1996
5   Newcastle  <NA>
6   Liverpool  12/11/2001

我需要用一个虚拟日期(比如 1866 年 6 月 21 日)替换缺失的日期,但仅限于谢菲尔德市。

在 SQL 中,语法是:

UPDATE Dataframe SET Date = "21/06/1866" WHERE city="Sheffield"

在 R 中,我尝试了以下方法,但成功有限(甚至没有):

filter <- (Dataframe$Date == is.na(Dataframe$Date) & Dataframe$City =="Sheffield")
Dataframe[filter,"Date"] <- as.Date("1866/06/21")

但是这会引发以下错误:

[&lt;-.data.frame(*tmp*, filter, "Date", value 中的错误 = -37814) : 数据框的下标赋值中不允许缺失值

有人有什么想法吗?我觉得这可能非常简单,但我只是还没有看到它是如何完成的。

【问题讨论】:

  • 您是否尝试过 Dataframe$Date[(is.na(Dataframe$Date)) & (Dataframe$City==Sheffield) = as.Date("1866/06/21", "%Y /%m/%d")
  • @JustinKlevs 这缺少一个 ],可能是一个 否?
  • @patrick 是的,我的错字

标签: r dataframe logical-operators conditional-split


【解决方案1】:
df[df$City == "Sheffield" & is.na(df$Date), "Date"] = as.Date("1866/06/21", format = "%Y/%m/%d")

> df
       City       Date
1 Sheffield 1985-05-19
2 Sheffield 1986-06-21
3 Sheffield 1866-06-21
4 Newcastle 1996-07-14
5 Newcastle       <NA>
6 Liverpool 2001-11-12

如果您查看过滤器,它只会返回 FALSE。

> filter <- (df$Date == is.na(df$Date) & df$City =="Sheffield")
> filter
[1] FALSE FALSE FALSE FALSE FALSE FALSE

您只需要写is.na(df$Date) 这将返回一个逻辑向量,指示日期是否为NA。你写的日期检查是 TRUE 或 FALSE(从 is.na(df$Date) 返回),它永远不会是因为它是一个日期。

> filter <- (is.na(df$Date) & df$City =="Sheffield")
> filter
[1] FALSE FALSE  TRUE FALSE FALSE FALSE

【讨论】:

    猜你喜欢
    • 2021-04-27
    • 2018-02-18
    • 2020-04-07
    • 2017-05-19
    • 2018-06-07
    • 1970-01-01
    • 2023-03-28
    • 2017-06-30
    • 2016-03-08
    相关资源
    最近更新 更多