在数据框中应用列表条件块

Apply block of list condition in dataframe

我正在尝试对现有数据框应用一些新条件(如下所示)。我不能使用 ifelse 因为逻辑是这样的:

  1. 如果计数<=3:保持原样
  2. 如果计数>3 :
    • If Code != "OFF15", c = "OK10" else c = "OFF15"
  3. 如果计数 > 3 且代码为 NA:代码=“OK10”

使用ifelse时无法生成第三个条件

Code = c("OFF15","OFF5",NA,"OFF5",NA)
count= c(3,4,4,2,1)
x= data.frame(Code,count)

我无法使用 ifelse,因为它有嵌套列表。我的预期是:

Code    Count
OFF15     3
OK10      2
OK10      3
OFF5      2
NA        1

您可以使用 dplyr:

library(dplyr)

df %>% 
  mutate(Code = case_when(count < 3 ~ Code,
                          count > 3 & Code != "OFF15" ~ "OK10",
                          TRUE ~ "OFF15"))

这个returns

   Code count
1 OFF15     3
2  OK10     4
3 OFF15     3
4  OFF5     2
5  <NA>     1

注意:我将 data.frame 命名为 df 而不是 x

我们可以使用嵌套的ifelses(只有一层嵌套仍然可以,否则case_when几乎是必须的)。

library(dplyr)

df %>% mutate(Code = ifelse(count<=3, Code, ifelse(!Code %in% "OFF15", "OK10", "OFF15"))

使用 data.table

中的 fcase
library(data.table)
setDT(x)[, Code := fcase(count < 3, Code, count > 3 & Code != "OFF15", 
        "OK10", default = "OFF15")]
 x
    Code count
1: OFF15     3
2:  OK10     4
3: OFF15     4
4:  OFF5     2
5:  <NA>     1