我有一个数据集,dt.train2
有1500个不同的观察值和130个变量。其中一个是languages
,可以是english
,french
,arabic
......
我想创建一个ifelse
字符串,为1
提供属性english
,为2
提供french
,为{{1}提供3
还有spanish
用于其他任何事情。我不知道该怎么做。
0
我正在使用它来运行有关销售的线性模型。
答案 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)]