Объединить дубликаты и присвоить значение наибольшей частоты (кроме нейтральных!) в 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» означает нейтральный, поэтому, если есть, например. дубликат с "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» рассматривались одинаково). если не было самой высокой частоты, присваивался «x». полезными подходами были:

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, чтобы действительно понять это.


person cptn    schedule 10.03.2014    source источник


Ответы (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
person Troy    schedule 10.03.2014