将列中的NA替换为按名称分组的同一列中的日期

时间:2015-11-06 05:14:57

标签: r dplyr

问题:需要在按名称分组的同一列中使用非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 - FALSEreplace的合适选项吗?

2 个答案:

答案 0 :(得分:1)

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

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

说&#39;数据&#39;是你的载体。用&#39; name&#39;和&#39; date&#39;作为您的列,您可以在&#39; date&#39;中使用NA值。列。

第1步:创建映射文件

>  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

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

要填写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值。