问题:需要在按名称分组的同一列中使用非NA值填写NA。
数据:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<script>
$(document).ready(function () {
var aTags = ["ask", "always", "all", "alright", "one", "foo",
"blackberry", "tweet", "force9", "westerners", "sport"
];
$("#tags").autocomplete({
source: aTags,
select: function () {
$('#tags').prop("readonly",true);
}
});
$('#tags').bind('keydown', function (event) {
if (event.keyCode === 8) {
event.preventDefault();
$('#tags').prop("value","");
$('#tags').prop("readonly",false);
}
});
});
</script>
<style>
#tags:focus {
border:1px solid #0000ff;
}
</style>
<input type='text' title='Tags' id='tags' />
期望的结果:
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>
“日期”列中的日期不在固定位置且随机化, (Bob [2],Ant [3],Ted [1])。对于同一用户,它们可能会出现多次,但该用户的日期始终相同。
我的逻辑:
按名称分组,将非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
列替换为日期列中的NA
。
尝试1
NA
然后尝试了
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
而不是实际日期。
问题1 - 如何找到列的非FALSE
值的值,而不是NA
/ TRUE
。
问题2 - FALSE
是replace
的合适选项吗?
答案 0 :(得分:1)
以下内容可能不涉及您的逻辑,但可能会解决您的问题。
创建一个矢量(原始的子集),其中只有非NA值。这将是填充NA值的映射向量。
说&#39;数据&#39;是你的载体。用&#39; name&#39;和&#39; date&#39;作为您的列,您可以在&#39; date&#39;中使用NA值。列。
> mapping<-data[!is.na(data$date),]
这将包含所有非NA行。如果日期中有多个非NA但相同的值,请执行
> mapping<-unique(mapping)
(如果只有一个非NA值对应于每个&#39;名称&#39;值,则可能不需要使用&#39;唯一&#39;功能的此步骤
所以映射将是这样的。
Name Date
Bob 2015-11-01
Ant 2015-11-03
Ted 2015-11-04
要填写NA值,请映射&#39;名称&#39;在映射向量中知道什么&#39;日期&#39;将与它们对应并将其粘贴到“日期”中。数据列&#39;。
data$Date<-mapping[match(data$Name,mapping$Name),2]
现在所有的&#39; NA&#39;将被您需要的东西取代。
答案 1 :(得分:-1)
使用 tapply 并命名为vector:
i <- tapply(a$date, a$Name, function(x) x[!is.na(x)][1])
date.combined <- levels(a$date)[i[a$Name]]
这假定 date 是一个因素。这也假设每个名称的第一个非na值是您想要的值,例如,如果您只有一个非na值。