2017-02-22 64 views
1

我不知道是否有一種方法fill隨機數字使用dcast(庫reshape2data.table)時,每個單獨的缺失值。例如:R dcast填寫樣本編號

ID = c('AA', 'AA', 'BB', 'BB', 'CC', 'CC', 'CC', 'DD', 'DD') 
Replica = c('H1','H3','H1','H2','H1','H2','H3','H2','H3') 
Value = c(1.3, 2.5, 1.4, 3.7, 9.5, 7.4, 7.1, 1.8, 8.4) 

example <- data.frame(ID=ID, Replica = Replica, Value = Value) 

做一個簡單的dcast

dfdc <- dcast(data=example, ID~Replica, value.var = 'Value', fill = sample(1:10, 1)) 

通知如何某些值被錯過:

ID H1 H2 H3 
1 AA 1.3 NA 2.5 
2 BB 1.4 3.7 NA 
3 CC 9.5 7.4 7.1 
4 DD NA 1.8 8.4 

我想填滿每個失蹤者的值與隨機數,類似於:

dfdc <- dcast(data=example, ID~Replica, value.var = 'Value', fill = sample(1:10, 1)) 

其給出作爲結果:

ID H1 H2 H3 
1 AA 1.3 2.0 2.5 
2 BB 1.4 3.7 2.0 
3 CC 9.5 7.4 7.1 
4 DD 2.0 1.8 8.4 

然而,所有缺失的值被替換爲相同的隨機數(2在這種情況下)。

是否可以將函數單獨應用於每個缺失值,並因此用不同的隨機數填充缺失值?

在此先感謝!

回答

3

如果您不關心警告,您可以只執行fill = sample(10),並且未使用的值將被刪除。你仍然會收到三個隨機數字。只要確保你確定樣本高於預期值NA值。

dcast(example, ID ~ Replica, fill = sample(10)) 
# ID H1 H2 H3 
# 1 AA 1.3 4.0 2.5 
# 2 BB 1.4 3.7 1.0 
# 3 CC 9.5 7.4 7.1 
# 4 DD 10.0 1.8 8.4 
# Warning message: 
# In ordered[is.na(ordered)] <- fill : 
# number of items to replace is not a multiple of replacement length 

當然,你也可以簡單地用suppressWarnings()來包裝。

suppressWarnings(dcast(example, ID ~ Replica, fill = sample(10))) 
# ID H1 H2 H3 
# 1 AA 1.3 6.0 2.5 
# 2 BB 1.4 3.7 5.0 
# 3 CC 9.5 7.4 7.1 
# 4 DD 9.0 1.8 8.4 
3

下面是使用tidyverse

library(tidyverse) 
complete(example, ID, Replica) %>% 
    mutate(Value = coalesce(Value, as.numeric(sample(1:10, n(), replace=TRUE)))) %>%  
    spread(Replica, Value) 
# A tibble: 4 × 4 
#  ID H1 H2 H3 
#* <fctr> <dbl> <dbl> <dbl> 
#1  AA 1.3 2.0 2.5 
#2  BB 1.4 3.7 1.0 
#3  CC 9.5 7.4 7.1 
#4  DD 8.0 1.8 8.4 
選項