我们说我有一个数据框:
word <- c("good", "great", "bad", "poor", "eh")
userid <- c(1, 2, 3, 4, 5)
d <- data.frame(userid, word)
我想添加一个数据集列sentiment
,这是一个factor
,取决于word
是什么:
words_pos <- c("good", "great")
words_neg <- c("bad", "poor")
calculate_sentiment <- function(x) {
if (x %in% words_pos) {
return("pos")
} else if (x %in% words_neg) {
return("neg")
}
return(NA)
}
d$sentiment <- apply(d, 1, function(x) calculate_sentiment(x['word'])
但是,现在d$sentiment
的类型为&#34;字符&#34;。如何使其成为合适水平的因素? pos
,neg
,NA
- 我甚至不确定NA
是否应该是因素水平,因为我只是在学习R. / p>
谢谢!
答案 0 :(得分:2)
这不是最简单的方法,但它是一种非常易读的方式(在我看来,最好使用抽象函数)...使用dplyr
的{{1} }以及mutate
:
case_when
我把它分开了一点,所以它更清楚,但这会:
library(dplyr)
d2 <- mutate(d, sentiment = factor(case_when(word %in% words_pos ~ "pos",
word %in% words_neg ~ "neg",
TRUE ~ NA_character_)))
glimpse(d2)
#> Observations: 5
#> Variables: 3
#> $ userid <dbl> 1, 2, 3, 4, 5
#> $ word <fctr> good, great, bad, poor, eh
#> $ sentiment <fctr> pos, pos, neg, neg, NA
data.frame
然后d
(更改列)“情绪”等于由mutate
语句,RHS上的结果(case
所需的所有内容都是相同类型的。)输出确认这是一个具有所需值的NA_character_
列。
答案 1 :(得分:1)
您可以将as.factor
添加到代码的最后一行。这将给出pos和neg的因素。 BTW NA不是一个因素。
d$sentiment <-as.factor(apply(d, 1, function(x) calculate_sentiment(x['word'])))