我正在研究一个R项目。我使用了一个普通的询问词典 - 一个有几个情感词典的词典。我从这里下载http://www.wjh.harvard.edu/~inquirer/inquirerbasic.xls
现在,我想创建一个新的列“得分”,如果值为Positive,则指定值为1
df <- read.csv("inquirerbasics.csv", header=T, stringsAsFactors=FALSE)
df3 <- subset(df, select=c(1:6))
head(df3)
Entry Source Positiv Negativ Pstv Affil
1 A H4Lvd
2 ABANDON H4Lvd Negativ
3 ABANDONMENT H4 Negativ
4 ABATE H4Lvd Negativ
5 ABATEMENT Lvd
6 ABDICATE H4 Negativ
现在我要创建一个列分数,我可以为Negativ值分配1分,为Positiv值分配3分,为Pstv分配3分?我该如何创建呢?
答案 0 :(得分:0)
一种选择是创建key/val
数据集,并在使用coalesce
library(dplyr)
keyval <- data.frame(key = c("Negativ", "Positiv", "Pstv"),
score = c(1, 1, 3), stringsAsFactors=FALSE)
df3 %>%
mutate(key = coalesce(Positiv, Negativ, Pstv)) %>%
left_join(., keyval) %>%
select(-key)
# Joining, by = "key"
# A tibble: 11,788 x 7
# Entry Source Positiv Negativ Pstv Affil score
# <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
# 1 A H4Lvd <NA> <NA> <NA> <NA> NA
# 2 ABANDON H4Lvd <NA> Negativ <NA> <NA> 1
# 3 ABANDONMENT H4 <NA> Negativ <NA> <NA> 1
# 4 ABATE H4Lvd <NA> Negativ <NA> <NA> 1
# 5 ABATEMENT Lvd <NA> <NA> <NA> <NA> NA
# 6 ABDICATE H4 <NA> Negativ <NA> <NA> 1
# 7 ABHOR H4 <NA> Negativ <NA> <NA> 1
# 8 ABIDE H4 Positiv <NA> <NA> Affil 1
# 9 ABILITY H4Lvd Positiv <NA> <NA> <NA> 1
#10 ABJECT H4 <NA> Negativ <NA> <NA> 1
# ... with 11,778 more rows
注意:这里,我们仅根据OP的帖子中显示的示例使用前6列。如果我们需要更多列,请更改'keyval',为这些列添加'key'和'score',coalesce
加入之前的所有列
答案 1 :(得分:0)
如果您正在使用词典,我建议使用我们的文本挖掘包quanteda,它具有处理词典的广泛功能。
它允许固定的,“glob”或正则表达式匹配字典值,这非常有用,因为许多文本字典方案使用globs作为通配符。
我将如何做到这一点。
dfm(txt) %>% dfm_lookup(dictionary = GI_dict, nomatch = "other")
## Document-feature matrix of: 1 document, 3 features (0% sparse).
## 1 x 3 sparse Matrix of class "dfmSparse"
## features
## docs positive negative other
## text1 2 1 16
虽然你可以一步完成,但我先创建了dfm,然后在第二步中将字典应用到它。
SELECT m.MessageID, m.MessageSubject, m.MessageContent, m.MessageIsRead,
m.MessageSendDate, m.MessageDeletedBy,
(s.UserFirstName & s.UserLastName) AS Sender,
(r.UserFirstName & r.UserLastName) AS Reciver
FROM (Messages as m INNER JOIN
Users as s
ON s.UserID = m.MessageSenderID
) INNER JOIN
Users as r
ON r.UserID = m.MessageReciverID;
请注意,您甚至不需要小写字典值,因为匹配的默认值不区分大小写。