如果我们不能使用never an if结构和if_else,该怎么办?[duplicate]

wtzytmuj  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(85)
    • 此问题在此处已有答案**:

Way to avoid nested ifelse statement in R(2个答案)
昨天关门了。
我想使用R在我的数据框中创建一个新列,该列的元素依赖于某个条件。例如,如果我的元素符合条件A,则分配的值将是A。如果我的元素符合条件B,则分配的值将是B。如果我的元素符合条件C,则分配的值将是C。
我知道如何用if_else结构为两个条件创建这样的结构,它允许说如果元素遵守条件A,那么它将具有值A,否则将具有值B。但是,我不知道如何为三个元素A、B、C这样做。
使用if,else if,else结构不起作用,因为它会给我错误"Error in if(condition){:条件的长度大于1 "因为我不能在条件中使用向量。
有没有人有办法在一般情况下解决这个问题?非常感谢!

ffvjumwh

ffvjumwh1#

可以使用dplyr包中的case_when函数

mutate(df, x=case_when(element1=='something' ~ A,
                       element2=='something' ~ B,
                       element3=='something' ~ C))
dgsult0t

dgsult0t2#

不知道什么对你不起作用,如果你愿意,你可以给我看你的代码,我会解释哪里出了问题。如果你给予更多的例子,你试图这样做会容易得多。
可以使用R中的ifelse()函数在数据框中创建一个新列,该列的元素取决于特定条件。条件、条件为真时分配的值以及条件为假时分配的值。
可以将多个ifelse()语句链接在一起来处理多个条件。例如,要处理三个条件A、B和C,可以执行以下操作:

df$new_column <- ifelse(conditionA(df$column), "A",
                       ifelse(conditionB(df$column), "B",
                              ifelse(conditionC(df$column), "C", "Other")))

第一个如果()将检查conditionA是否为真。如果为真,则将值“A”赋给新列。如果为假,则执行下一个ifelse()将检查conditionB是否为真。如果为真,则将值“B”赋给新列。如果为假,则执行下一个ifelse()将检查conditionC是否为真。如果为真,则将值“C”赋给新列。如果为假,则将值“Other”赋给新列。
您也可以使用dplyr包中的case_when()函数作为基于多个条件创建新列的替代方法。例如:

df <- df %>% 
  mutate(new_column = case_when(conditionA(column) ~ "A",
                                conditionB(column) ~ "B",
                                conditionC(column) ~ "C",
                                TRUE ~ "Other"))

也可以使用R中的cut()函数基于多个条件创建新列。
您需要创建一个间隔向量以及将分配给这些间隔的值。例如:

df$new_column <- cut(df$column, breaks = c(1,5,10), labels = c("A", "B", "C"), right = TRUE)

它将创建一个新列new_column,该列将值“A”赋给column column中1到5之间的元素,将值“B”赋给5到10之间的元素,将值“C”赋给大于10的元素。
希望这能有所帮助!如果你有其他问题,请告诉我。

相关问题