2015-11-06 33 views
0

問題:需要填寫同名列中按名稱分組的非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

回答

-1

使用tapply並命名爲載體:

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

這是假設日期是一個因素。這也假設每個名稱的第一個非na值是您想要的值,就像您只有一個非na值一樣。

1

以下可能不涉及您的邏輯,但可能會解決您的問題。

創建一個向量(原始子集),其中只有非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 <-mapping $ Date [match(data $ Name,mapping $ Name)] – ant