[英]how to “translate” values of a vector into another vector in R
How can I translate the column CLASS, so that I get a new column CLASS2 with "1" = "positive", "-1" = "negative", "0" = "neutral". 如何转换CLASS列,以便获得新的CLASS2列,其值为“ 1” =“正”,“-1” =“负”,“ 0” =“中性”。 I know this is a very basic question, and I think one can use
ifelse()
for this. 我知道这是一个非常基本的问题,我认为可以
ifelse()
使用ifelse()
。 But I just don't know how to use that function correctly. 但是我只是不知道如何正确使用该功能。
DATE <- c("01.01.2000","02.01.2000","03.01.2000","06.01.2000","07.01.2000","09.01.2000","10.01.2000","01.01.2000","02.01.2000","04.01.2000","06.01.2000","07.01.2000","09.01.2000","10.01.2000")
RET <- c(-2.0,1.1,3,1.4,-0.2, 0.6, 0.1, -0.21, -1.2, 0.9, 0.3, -0.1,0.3,-0.12)
CLASS <- c("1","-1","0","1","1","-1","0","1","-1","-1","1","0","0","0")
df <- data.frame(DATE, RET, CLASS)
df
The output should look like this: 输出应如下所示:
DATE <- c("01.01.2000","02.01.2000","03.01.2000","06.01.2000","07.01.2000","09.01.2000","10.01.2000","01.01.2000","02.01.2000","04.01.2000","06.01.2000","07.01.2000","09.01.2000","10.01.2000")
RET <- c(-2.0,1.1,3,1.4,-0.2, 0.6, 0.1, -0.21, -1.2, 0.9, 0.3, -0.1,0.3,-0.12)
CLASS <- c("1","-1","0","1","1","-1","0","1","-1","-1","1","0","0","0")
CLASS2 <- c("positive", "negative", "neutral", "positive", "positive", "negative", "neutral", "positive", "negative", "negative", "positive", "neutral", "neutral", "neutral")
df <- data.frame(DATE, RET, CLASS, CLASS2)
df
# DATE RET CLASS CLASS2
# 1 01.01.2000 -2.00 1 positive
# 2 02.01.2000 1.10 -1 negative
# 3 03.01.2000 3.00 0 neutral
# 4 06.01.2000 1.40 1 positive
# 5 07.01.2000 -0.20 1 positive
# 6 09.01.2000 0.60 -1 negative
# 7 10.01.2000 0.10 0 neutral
# 8 01.01.2000 -0.21 1 positive
# 9 02.01.2000 -1.20 -1 negative
# 10 04.01.2000 0.90 -1 negative
# 11 06.01.2000 0.30 1 positive
# 12 07.01.2000 -0.10 0 neutral
# 13 09.01.2000 0.30 0 neutral
# 14 10.01.2000 -0.12 0 neutral
Thank You! 谢谢!
Here's a simple way to do it using a helper function and sapply
: 这是使用辅助函数和
sapply
进行操作的一种简单方法:
translate <- function(x) {
if (x == '1') {
'positive'
} else if (x == '-1') {
'negative'
} else {
'neutral'
}
}
df <- data.frame(DATE, RET, CLASS, CLASS2=sapply(CLASS, translate))
Or you can rewrite translate
using ifelse
to make it more compact: 或者,您可以使用
ifelse
重写translate
以使其更紧凑:
translate <- function(x) {
ifelse(x == '1', 'positive', ifelse(x == '-1', 'negative', 'neutral'))
}
Both of these will produce the output you asked for. 两者都会产生您要求的输出。 But there might be a better way.
但是也许有更好的方法。
...like the one @joran suggested, if CLASS
is of factor type (which probably it is): ...就像@joran建议的那样,如果
CLASS
是因子类型(可能是):
df$CLASS2 <- c('negative','neutral','positive')[df$CLASS]
As @beginneR pointed out, you don't need a function in my first two proposals. 正如@beginneR指出的那样,在我的前两个建议中不需要使用函数。 But I like to use functions for better readability.
但是我喜欢使用函数来提高可读性。
这是一种一般的方法,使用match
可以将其应用于更多级别:
CLASS2 <- c('positive','negative','neutral')[ match(CLASS, c('1','-1','0') ) ]
您甚至不需要定义一个函数并使用sapply
,只需创建一个新列并直接在其上使用ifelse
即可:
df$Class2 <- with(df, ifelse(CLASS == '1', 'positive', ifelse(CLASS == '-1', 'negative', 'neutral')))
dplyr::case_when
is an option: dplyr::case_when
是一个选项:
df %>%
mutate(
CLASS2 = case_when(
CLASS == 1 ~ 'positive',
CLASS == 0 ~ 'neutral',
CLASS == -1 ~ 'negative',
TRUE ~ '?'
)
)
Super readable, isn't it? 超级可读,不是吗?
Although if you had more levels in CLASS
, typing all those CLASS ==
conditions would've been cumbersome. 尽管如果您在
CLASS
拥有更多级别,则键入所有那些CLASS ==
条件将很麻烦。 In that case, IMHO, sapply
is indeed the best option. 在这种情况下,恕我直言,
sapply
的确是最好的选择。 Or purrr::map
for that matter! 或者说
purrr::map
!
> x <- c(-1, -1, 0, 1, -1) %>% as.character()
> x %>% map(~ list(`-1` = 'negative', `0` = 'neutral', `1` = 'positive')[[.x]]) %>% unlist()
[1] "negative" "negative" "neutral" "positive" "negative"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.