用名称分组列出的同一列中的日期替换NA

问题描述:

问题:需要填写同名列中按名称分组的非NA值的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 

在日期栏的日期不在一个固定的位置,并且是随机的, (鲍勃[2],蚂蚁[3],Ted [1])。他们可能会多次出现在同一个用户身上,但日期对于该用户而言始终是相同的。

我的逻辑:

集团按名称,按非NA小号取代NA S IN列日期。

尝试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

使用tapply并命名为载体:

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

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

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

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

说'数据'是你的载体。将“名称”和“日期”作为列,在“日期”列中有NA值。

步骤1:创建的映射文件

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

这将具有所有非NA行。如果有一个以上的非NA但日期相同的价值观,做

> mapping<-unique(mapping) 

(可能不会,如果没有对应于每一个“名称”唯一一个非NA值需要这一步用“独一无二”功能值)

所以映射将是这样的。

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”将被您所需要的替换。

+0

我能够使用你的方法,并得到我想要的!虽然我需要将其更改为 data $ Date ant