我想知道是否可以將同一case_when陳述句中的結果粘貼在一起(即,對于給定的行,多個陳述句是否為真)。我知道我可以做如下的事情來創建額外的列,然后unite一起創建。但是我想知道是否有一種更有效的方法來做到這一點(并且不那么冗長),而不必顯式創建var.mand var.o。
資料
df <- structure(list(
ind = 1:10,
var = c(-21, -60, 7, 8,
9, 10, NA, 14, 101, 160)
),
class = "data.frame",
row.names = c(NA, -10L))
代碼
library(tidyverse)
df %>%
mutate(
var.m = ifelse(row.names(df) %in% (which(abs(diff(var, lag = 1)) > 10)), "derivative", NA),
var.o = ifelse((var 50) > 90, "add", NA),
results = case_when(is.na(var) ~ "Missing Data",
var > 100 ~ "High",
var < -20 ~ "Low")) %>%
unite(
"message",
c(var.m, results, var.o),
sep = "_",
remove = TRUE,
na.rm = TRUE
)
輸出/預期輸出
ind var message
1 1 -21 derivative_Low
2 2 -60 derivative_Low
3 3 7
4 4 8
5 5 9
6 6 10
7 7 NA Missing Data
8 8 14 derivative
9 9 101 derivative_High_add
10 10 160 High_add
那么,換句話說,是否有可能放棄創造var.m并var.o在其中做所有事情case_when?還是在將訊息連接在一起之前創建多個變數(即var.m和var.o)的替代方法?
uj5u.com熱心網友回復:
df %>%
mutate(
message = paste(
coalesce(if_else(c(abs(diff(var, lag = 1)) > 10, FALSE), "derivative", ""), ""),
coalesce(if_else((var 50) > 90, "add", ""), ""),
coalesce(case_when(
is.na(var) ~ "Missing Data",
var > 100 ~ "High",
var < -20 ~ "Low"), ""),
sep = "_"),
message = gsub("^_|_$", "",
gsub("__", "_", message))
)
# ind var message
# 1 1 -21 derivative_Low
# 2 2 -60 derivative_Low
# 3 3 7
# 4 4 8
# 5 5 9
# 6 6 10
# 7 7 NA Missing Data
# 8 8 14 derivative
# 9 9 101 derivative_add_High
# 10 10 160 add_High
這些coalesce電話是因為其中任何一個都可能是NA因為事情可能會溜走。我可以!is.na(var)在一些條件句之前添加,但diff引入了一個挑戰,因為我們也需要!lead(is.na(var),default=F)這樣的東西;因為這coalesce似乎更簡單。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/416332.html
標籤:
