我想按組用數字序列唯一地填充 NA。
這是一個可重現的示例:
library(missForest)
library(dplyr)
set.seed(1)
d <- data.frame(id = rep(1:3,each=5),
year = rep(1997:2001,3))
d$year<- prodNA(d[2],noNA=0.3)
d<-arrange(d,id,year)
d
#> id year
#> 1 1 1998
#> 2 1 1999
#> 3 1 2001
#> 4 1 NA
#> 5 1 NA
#> 6 2 1997
#> 7 2 1999
#> 8 2 2001
#> 9 2 NA
#> 10 2 NA
#> 11 3 1997
#> 12 3 1998
#> 13 3 1999
#> 14 3 2000
#> 15 3 2001
NAs 應替換為 1997 至 2001 數字序列的非已取值;使結果資料框如下所示:
data.frame(id = rep(1:3, each = 5), year = rep(1997:2001, 3))
#> id year
#> 1 1 1997
#> 2 1 1998
#> 3 1 1999
#> 4 1 2000
#> 5 1 2001
#> 6 2 1997
#> 7 2 1998
#> 8 2 1999
#> 9 2 2000
#> 10 2 2001
#> 11 3 1997
#> 12 3 1998
#> 13 3 1999
#> 14 3 2000
#> 15 3 2001
uj5u.com熱心網友回復:
我們可能會使用 coalesce
library(dplyr)
d$year <- coalesce(prodNA(d[2],noNA=0.3)$year, d$year)
如果需要分組
library(dplyr)
d %>%
group_by(id) %>%
mutate(year = coalesce(prodNA(cur_data()["year"], noNA = 0.3)$year, year)) %>%
ungroup
-輸出
# A tibble: 15 × 2
id year
<int> <int>
1 1 1997
2 1 1998
3 1 1999
4 1 2000
5 1 2001
6 2 1997
7 2 1998
8 2 1999
9 2 2000
10 2 2001
11 3 1997
12 3 1998
13 3 1999
14 3 2000
15 3 2001
資料
set.seed(1)
d <- data.frame(id = rep(1:3,each=5),
year = rep(1997:2001,3))
uj5u.com熱心網友回復:
基礎 R 替代方案:
d$year2 <- ave(d$year, d$id, FUN = function(z) { z[is.na(z)] <- setdiff(1997:2001, z); z;})
d
# id year year2
# 1 1 1998 1998
# 2 1 1999 1999
# 3 1 2001 2001
# 4 1 NA 1997
# 5 1 NA 2000
# 6 2 1997 1997
# 7 2 1999 1999
# 8 2 2001 2001
# 9 2 NA 1998
# 10 2 NA 2000
# 11 3 1997 1997
# 12 3 1998 1998
# 13 3 1999 1999
# 14 3 2000 2000
# 15 3 2001 2001
ave是一個簡單的函式,用于根據分組標準(類似list第二個 arg)對向量(第一個 arg)進行操作。該函式一次被賦予一個組的單個值向量,因此使用這些資料,匿名函式被呼叫了 3 次。唯一的問題ave是ave總是將函式的回傳值強制為與輸入向量相同的類,這可能令人沮喪和荒謬(我確信在某些時候這種行為是有原因的)。
知道z在任何時間一次year對一組都是全部,該函式的內部作業很簡單:用 中NA缺失的值替換所有值1997:2001。不過,這有一個很大的警告:這假定 中唯一合法的值z是c(NA, 1997:2001); 如果還有其他事情,這可能會非常失敗/爆炸或導致您鄰居的汽車誤火。
從這個意義上說,這種方法有點脆弱。為了更有彈性,我們可能需要一些津貼。例如,可以將值留1997:2001在資料之外,還是應該替換它們?如果不是,那么是否有一種啟發式方法可以確定哪些缺失值被歸入NA值中?
資料
d <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), year = c(1998L, 1999L, 2001L, NA, NA, 1997L, 1999L, 2001L, NA, NA, 1997L, 1998L, 1999L, 2000L, 2001L)), class = "data.frame", row.names = c(NA, -15L))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/347592.html
下一篇:取消選擇dplyr中的變數
