在具有多个分类条件的R中的Ifelse

时间:2017-11-17 20:57:47

标签: r if-statement data.table conditional

我有一个数据集,dt.train2有1500个不同的观察值和130个变量。其中一个是languages,可以是englishfrencharabic ......

我想创建一个ifelse字符串,为1提供属性english,为2提供french,为{{1}提供3还有spanish用于其他任何事情。我不知道该怎么做。

0

我正在使用它来运行有关销售的线性模型。

4 个答案:

答案 0 :(得分:2)

你几乎在那里使用ifelse(),你只需要最终的else结果(以及几个没有关闭的括号)。

dt.train2[, language_string := ifelse(
  language == "english", 1,
    ifelse(language == "french", 2,
      ifelse(language == "spanish", 3, 0)
    )
  )
]

您还可以采取其他几种方式:

创建一个查找表并加入:

# sample data
dt = data.table(language = c("english", "french", "spanish", "arabic", "chinese", "pig latin"))


lookup = data.table(language = c("english", "french", "spanish"),
                    language_string = c(1, 2, 3))

dt2 = merge(dt, lookup, by = "language", all.x = TRUE)
dt2[is.na(language_string), language_string := 0]

上面的查找表方法可能是最好的可伸缩性。但是,对于如此少量的编码,您也可以设置每个编码:

# start with the default, 0
dt[, language_string := 0 ]
# then do each of the exceptions
dt[lanuage == "english", language_string := 1]
dt[language == "french", language_string := 2]
dt[language == "spanish", language_string := 3]

答案 1 :(得分:1)

我同意评论,如果这是一个线性模型,那么这是一个糟糕的方法。如果您坚持使用语言作为预测变量,那么最好先制作一系列虚拟变量。在这种情况下,您将添加3个预测变量(“英语”,“法语”,“阿拉伯语”),它们都取0或1的值。

无论哪种方式,这是我的 dplyr 解决问题,它使用CASE WHEN SQL风格的语法,更容易阅读。

require(tidyverse)
dt.train2 <- dt.train2 %>%
          mutate(language_string = case_when(language == "english" ~ 1,
                                             language == "french" ~ 2,
                                             language == "spanish" ~ 3,
                                             TRUE ~ 0))

答案 2 :(得分:0)

检查一下:

 t <- 'es'
 tt <- (if (t == 'en') 1 else if (t == 'fr') {2} else if (t == 'es') 3 else 0)
 tt
 [1] 0

然后您可以将其应用于数据帧:

df <- data.frame(l=c('en', 'fr', 'es', 'sthelse'))
df$lnum <- sapply(df$l, function(t){(if (t == 'en') 1 else if (t == 'fr') {2} else if (t == 'es') 3 else 0)})
df
        l lnum
1      en    1
2      fr    2
3      es    3
4 sthelse    0

答案 3 :(得分:0)

language_options <- c("english", "french", "spanish", ...)
dt.train2[, language_string := match(language, language_options)]