2
我想用dplyr,piping和approx()來插入缺失值。如何在dplyr中的條件語句中使用mutate_at()內的approx()?
數據:
test <- structure(list(site = structure(c(3L, 3L, 3L, 3L, 1L, 1L, 1L,
1L, 2L, 2L, 2L, 2L), .Label = c("lake", "stream", "wetland"), class = "factor"),
depth = c(0L, -3L, -4L, -8L, 0L, -1L, -3L, -5L, 0L, -2L,
-4L, -6L), var1 = c(1L, NA, 3L, 4L, 1L, 2L, NA, 4L, 1L, NA,
NA, 4L), var2 = c(1L, NA, 3L, 4L, NA, NA, NA, NA, NA, 2L,
NA, NA)), .Names = c("site", "depth", "var1", "var2"), class = "data.frame", row.names = c(NA,
-12L))
此代碼:
library(tidyverse)
# interpolate missing var1 values for each site using approx()
test_int <- test %>%
group_by(site) %>%
mutate_at(vars(c(var1)),
funs("i" = approx(depth, ., depth, rule=1, method="linear")[["y"]]))
但代碼將不再有效,如果遇到分組(網站& VAR)不具有至少2個非NA值,例如,
# here I'm trying to interpolate missing values for var1 & var2
test_int2 <- test %>%
group_by(site) %>%
mutate_at(vars(c(var1, var2)),
funs("i" = approx(depth, ., depth, rule=1, method="linear")[["y"]]))
R適當地引發此錯誤: mutate_impl錯誤(.data,dots): 評估錯誤:需要至少兩個非NA值進行插值。
如何包含條件語句或過濾器,以便它只嘗試插入站點至少有2個非NA值並跳過其餘部分或返回NA的情況?
運行你的代碼,如果我們只用了VAR2這是行不通的。我相信這與湖的網站有關。它在分組內沒有任何值用於處理。這是一個數據問題,而不是dplyr。 – jacobsg
是的,你重申了我最初的問題。這就是爲什麼我要求條件語句的原因,所以如果代碼遇到一個沒有至少2個非NA值的站點&var組合,它不會停止。感謝Andrew Gustar提供以下解決方案。 –
啊我不好。我沒有仔細閱讀。歡呼 – jacobsg