用名称分组列出的同一列中的日期替换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”将被您所需要的替换。
我能够使用你的方法,并得到我想要的!虽然我需要将其更改为 data $ Date ant