[英]Replacing NAs with zeros only in non-empty groups
我有一個應該很容易解決的問題,但我就是想不通。 我有一個包含組和變量的龐大數據集。 對於此變量,有些組是空的(僅填充 NA),有些包含值但也包含 NA。
例如:
ID <- c("A1","A1","A1","A1","B1","B1","B1","B1", "B1", "C1", "C1", "C1")
Value1 <- c(0,2,1,1,NA,1,1,NA,1,NA,NA,NA)
data <- data.frame(ID, Value1)
我想將所有 NA 更改為零,但僅限於包含信息的組。
所以像這樣:
ID <- c("A1","A1","A1","A1","B1","B1","B1","B1","B1","C1","C1","C1")
Value1 <- c(0,2,1,1,0,1,1,0,1,NA,NA,NA)
我嘗試使用 group_by(ID) 並在條件 max(Value1)>=0 下“替換”,但 max() 不能作為條件使用,或者不能與 NA 一起使用。 不幸的是,我在工作中經常需要這種調節,所以我也很感激任何關於哪些是選擇性地對待群體的最佳方案的建議。
您可以使用一個簡單的 if` 語句,即
library(dplyr)
library(tidyr)
data %>%
group_by(ID) %>%
mutate(Value1 = if (all(is.na(Value1))){Value1}else{replace_na(Value1, 0)})
這使,
# A tibble: 12 x 2 # Groups: ID [3] ID Value1 <fct> <dbl> 1 A1 0 2 A1 2 3 A1 1 4 A1 1 5 B1 0 6 B1 1 7 B1 1 8 B1 0 9 B1 1 10 C1 NA 11 C1 NA 12 C1 NA
這是一個基本的 R 解決方案
dfout <- Reduce(rbind,
lapply(split(data,data$ID),
function(v) {if (!all(is.na(v$Value1))) v$Value1[is.na(v$Value1)]<- 0; v}))
這樣
> dfout
ID Value1
1 A1 0
2 A1 2
3 A1 1
4 A1 1
5 B1 0
6 B1 1
7 B1 1
8 B1 0
9 B1 1
10 C1 NA
11 C1 NA
12 C1 NA
隨着dplyr
:
data %>%
group_by(ID) %>%
mutate(Value1 = ifelse(any(!is.na(Value1)) & is.na(Value1), 0, Value1))
# A tibble: 12 x 2
# Groups: ID [3]
ID Value1
<fct> <dbl>
1 A1 0
2 A1 2
3 A1 1
4 A1 1
5 B1 0
6 B1 1
7 B1 1
8 B1 0
9 B1 1
10 C1 NA
11 C1 NA
12 C1 NA
使用data.table
setDT(data)
data[, Value1 := if (all(is.na(Value1))) NA else replace(Value1, is.na(Value1), 0), by = ID]
ID Value1
1: A1 0
2: A1 2
3: A1 1
4: A1 1
5: B1 0
6: B1 1
7: B1 1
8: B1 0
9: B1 1
10: C1 NA
11: C1 NA
12: C1 NA
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.