Ifelse语句具有4个条件

时间:2019-05-15 23:49:30

标签: r if-statement

使用以下示例数据,我试图基于四个条件变量(“ A”)的值在我的dataframe(df)中创建一个新列“ NOTA_NUM”(值0或1或2或3或4) “”,“ B”,“ C”,“ D”,“ E”)从一个现有列(第1列)开始。

我已经尝试过:

df$NOTA_NUM <- ifelse(rowSums(df[ , "column1"]=="A"), 0,
        ifelse(rowSums(df[ , "column1"]=="B"), 1,
               ifelse(rowSums(df[ ,"column1"]=="C"), 2,
                      ifelse(rowSums(df[ , "column1"]=="D",3,4))

但是这并没有达到我想要的方式。

我希望“ NOTA_NUM”看起来像这样:

column1   NOTA_NUM
A             0
C             2
B             1
D             3
E             4

4 个答案:

答案 0 :(得分:4)

以下是一些方法。不使用任何软件包。

1)匹配使用末尾注释中可重复显示的DFcolumn1中的每个元素匹配到LETTERS[1:4],如果不匹配则使用5。从中减去1。

transform(DF, NOIA_NUM = match(column1, LETTERS[1:4], nomatch = 5) - 1)

给予:

  column1 NOIA_NUM
1       A        0
2       C        2
3       B        1
4       D        3
5       E        4

2)开关:另一种可能性是使用switch

transform(DF, NOTA_NUM = sapply(column1, switch, A = 0, B = 1, C = 2, D = 3, 4))

3)算术:此算法使用算术表达式,其计算结果为所需值:

transform(DF, NOTA_NUM = (0-4) * (column1 == "A") + 
                         (1-4) * (column1 == "B") + 
                         (2-4) * (column1 == "C") + 
                         (3-4) * (column1 == "D") + 
                         4)

注意

DF <- data.frame(column1 =  c("A", "C", "B", "D", "E"), stringsAsFactors = FALSE)

答案 1 :(得分:1)

在以下情况下,我喜欢dplyr::case_when

library(dplyr)

df <- data.frame(column1 = c("A", "C", "B", "D", "E")) %>% 
  mutate(NOTA_NUM = case_when(column1 == "A" ~ 0, 
                              column1 == "B" ~ 1, 
                              column1 == "C" ~ 2, 
                              column1 == "D" ~ 3, 
                              TRUE ~ 4))

答案 2 :(得分:0)

为此,我会避免使用ifelse。您应该使用一种更高效,更紧凑的方法进行表查找或转换。尝试使用命名向量作为表格,并将输入传递给“ [”函数:

> lookup = c(A=0, C= 2, B =  1, D= 3, E = 4)
> df <- data.frame( cl1 = names(lookup))
> df
  cl1
1   A
2   C
3   B
4   D
5   E
> df$NOTA_NUM= lookup[df$cl1]
> df
  cl1 NOTA_NUM
1   A      0
2   C      1
3   B      2
4   D      3
5   E      4

如果您需要将它们作为字母,请在查找向量中将它们引号,但要注意,除非明确阻止该默认操作,否则data.frame函数将使它们成为因素。请参阅?data.frame以正确使用stringsAsFactors参数

答案 3 :(得分:0)

不确定我建议使用as.numeric(factor(...))作为一般解决方案,但可以解决您的情况:

library(dplyr)

set.seed(1001) # for reproducible sample
# column1 = factor as stringsAsFactors = TRUE (default)
data.frame(column1 = sample(LETTERS[1:5], 50, replace = TRUE)) %>% 
  mutate(NOTA_NUM = as.numeric(column1)-1)