【问题标题】:Replace NA's in a column with a date in same column grouped by name将列中的 NA 替换为按名称分组的同一列中的日期
【发布时间】:2015-11-06 13:41:47
【问题描述】:

问题:需要在按名称分组的同一列中用非 NA 值填写 NA。

数据:

Name   Date
Bob    <NA>
Bob    2015-11-01
Bob    <NA>
Bob    <NA>
Ant    <NA>
Ant    <NA>
Ant    2015-11-03
Ant    <NA>
Ted    2015-11-04
Ted    <NA>
Ted    <NA>
Ted    <NA>

期望的结果:

Name   Date          Date.Combined  
Bob    <NA>          2015-11-01
Bob    2015-11-01    2015-11-01
Bob    <NA>          2015-11-01
Bob    <NA>          2015-11-01
Ant    <NA>          2015-11-03
Ant    <NA>          2015-11-03
Ant    2015-11-03    2015-11-03
Ant    <NA>          2015-11-03
Ted    2015-11-04    2015-11-04
Ted    <NA>          2015-11-04
Ted    <NA>          2015-11-04
Ted    <NA>          2015-11-04

Date列中的日期不是固定的,是随机的, (鲍勃[2]、蚂蚁[3]、泰德[1])。对于同一用户,它们可能会出现多次,但该用户的日期将始终相同。

我的逻辑:

按名称分组,将日期列中的NAs 替换为非NAs。

尝试 1

df %>%
  group_by(name) %>%
  mutate(Date.Combined = !is.na(Date))

然后尝试

df %>%
  group_by(name) %>%
  mutate(Date.Combined = ifelse(is.na(Date), !is.na(Date), !is.na(Date))

但这些只给了我TRUE/FALSE,而不是实际日期。

问题1 - 如何找到非NA 列的值而不是获取TRUE/FALSE

问题 2 - replace 是否比 ifelse 更合适?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    以下可能不涉及您的逻辑,但可能会解决您的问题。

    创建一个向量(原始的子集),其中只有非 NA 值。这将是填充 NA 值的映射向量。

    说“数据”是你的向量。使用“名称”和“日期”作为列,“日期”列中有 NA 值。

    第 1 步:创建映射文件

    >  mapping<-data[!is.na(data$date),]
    

    这将包含所有非 NA 行。如果日期中有多个非 NA 但相同的值,请执行

    > mapping<-unique(mapping)
    

    (如果每个'Name'值只有一个非NA值对应,则可能不需要此步骤具有'unique'功能)

    所以映射将是这样的。

    Name   Date
    Bob    2015-11-01
    Ant    2015-11-03
    Ted    2015-11-04
    

    第 2 步:从映射文件中选择

    要填写 NA 值,请在映射向量中映射“名称”以了解与它们对应的“日期”并将它们粘贴到“数据”的“日期”列中。

    data$Date<-mapping[match(data$Name,mapping$Name),2]
    

    现在所有的 'NA' 都将替换为您需要的。

    【讨论】:

    • 我能用你的方法得到我想要的!虽然我需要将其更改为 data$Date
    【解决方案2】:

    使用tapply和命名向量:

    i <- tapply(a$date, a$Name, function(x) x[!is.na(x)][1])
    date.combined <- levels(a$date)[i[a$Name]]
    

    这假设 日期 是一个因素。这还假设每个名称的第一个非 na 值是您想要的,就像您只有一个非 na 值一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 2018-11-17
      • 1970-01-01
      相关资源
      最近更新 更多