Слияние дубликатов и присвоение значения самой высокой частоты (кроме нейтральных!) В R
Я написал очень похожий вопрос, но мне нужно изменить условия. у меня есть data.frame с несколькими записями. столбцы "нет", "статья" и "класс" ("p"= положительный, "n"= отрицательный, "x"= нейтральный). это выглядит так:
no <- c(3, 3, 5, 5, 5, 24, 24, 35, 35, 41, 41, 41)
article <- c("earnings went up.", "earnings went up.", "massive layoff.", "they moved their offices.", "Mr. X joined the company.", "class action filed.", "accident in warehouse.", "blabla one.", "blabla two.", "blabla three.", "blabla four.", "blabla five.")
class <- c("p","p","n","x","x","n","n","x","p","p","n","p")
mydf <- data.frame(no, article, class)
mydf
# no article class
# 1 3 earnings went up. p
# 2 3 earnings went up. p
# 3 5 massive layoff. n
# 4 5 they moved their offices. x
# 5 5 Mr. X joined the company. x
# 6 24 class action filed. n
# 7 24 accident in warehouse. n
# 8 35 blabla one. x
# 9 35 blabla two. p
# 10 41 blabla three. p
# 11 41 blabla four. n
# 12 41 blabla five. p
Я хочу избавиться от нескольких записей. статьи нескольких записей должны быть объединены, но только если статьи НЕ совпадают! затем, я хочу, чтобы класс с самой высокой частотой был назначен за исключением "х". "x" означает нейтральный, поэтому, если есть, например, дубликат с "x", "p" я все же хочу, чтобы "p" был назначен. если есть "n", следует назначить "x" -> "n". то же самое с другими несколькими записями. если есть равные частоты "p" и "n" -> "x" должны быть назначены.
# examples:
# "p", "x" --> "p"
# "p", "n" --> "x"
# "x", "n", "x" --> "n"
# "p", "n", "p" --> "p"
# the resulting data.frame should look like this:
# no article class
# 1 3 earnings went up. p
# 2 5 massive layoff. they moved their offices. Mr. X joined the company. n
# 3 24 class action filed. accident in warehouse. n
# 4 35 blabla one. blabla two. p
# 5 41 blabla four. blabla five. p
в моем старом вопросе статьи были объединены, даже если они были одинаковыми, и был назначен класс с наибольшей частотой ("x", "n", "p" обрабатывались одинаково). если не было наибольшей частоты, был назначен "х". полезные подходы были:
library(qdap)
df2 <- with(mydf, sentCombine(article, no))
df2$class <- df2$no %l% vect2df(c(tapply(mydf[, 3], mydf[, 1], function(x){
tab <- table(x)
ifelse(sum(tab %in% max(tab)) > 1, "x", names(tab)[max(tab) == tab])
})))
Я пытался изменить этот код, но я слишком мало знаю о том, как писать функции и о qdap, чтобы действительно понять это.
1 ответ
Как насчет этого с dplyr
require(dplyr) # for aggregation
getclass<-function(class){
n.n<-length(class[class=="n"])
n.p<-length(class[class=="p"])
ret<-"x" # return x, unless
if(n.n>n.p)ret<-"n" # there are more n's than p's (return p)
if(n.n<n.p)ret<-"p" # or more p's than n's (return n)
return(ret)
}
group_by(mydf,no) %.%
summarise(article=paste0(unique(article),collapse=" "),class=getclass(class))
Source: local data frame [5 x 3]
no article class
1 3 earnings went up. p
2 5 massive layoff. they moved their offices. Mr. X joined the company. n
3 24 class action filed. accident in warehouse. n
4 35 blabla one. blabla two. p
5 41 blabla three. blabla four. blabla five. p