Удалить строки из фрейма данных, если сложенные значения меньше x

У меня есть следующий фрейм данных, назовите его df, который представляет собой фрейм данных, состоящий из трех векторов: «Сцена», «Имя» и «Внешний вид». Я хотел бы суммировать значение «Внешний вид» для каждого экземпляра, в котором «Имя» находится в списке, и разделить его на количество раз, когда имя появляется в списке. Затем я хочу удалить из df все строки, в которых это общее число (общее количество появлений, деленное на количество раз, когда имя находится в списке) меньше 2.

Так, например, здесь, в df, будут отброшены все строки, кроме строк Джона и Гитлера, значения которых вычисляются как (2+2)/2=2 и (4+1/2)=2,5.

Scene      Name   Appearances 
112       Hamlet         1  
113       Zyklon         1 
114       Hitler         4  
115  Chamberlain         1  
115       Hitler         1  
117       Gospel         1  
117         John         2  
117      Deussen         1  
118        Plato         1 
118         John         2  
118        Hegel         1  
119      Cankara         1  
120        Freud         1  
121        Freud         1  
122  Petersbourg         1 

Я пробовал пару вещей, вместо этого с некоторым умножением, но они оба математически неверны и возвращают ошибки.

Во-первых, я попытался превратить df в двустороннюю таблицу и удалить записи, принадлежащие редкому имени:

removeinfreqs <- function(df){
x <- table(df$Name, df$Appearances)
d<-df[(df$Name %in% names * df$Appearances)/df$Name %in% names(x[x >= 3]), ]
d
}

но я получил ошибку: «Ошибка в совпадении (x, таблица, nomatch = 0L):« совпадение »требует векторных аргументов»

Я пробовал то же самое с командой подмножества:

df_less<-subset(df, df$Name %in% names * df$Appearances/df$Name %in% names >= 3)

Но я получаю ту же ошибку: «Ошибка в совпадении (x, таблица, nomatch = 0L):« совпадение »требует векторных аргументов»

У меня очень мало опыта работы с фреймами данных в r. Как я могу выполнить эту операцию? Любая помощь очень ценится.


person Mon    schedule 17.12.2013    source источник


Ответы (2)


Сначала вычислите средние значения Appearance для каждого Name:

meanAp <- with(df, ave(Appearances, Name, FUN = mean))

Во-вторых, извлечь строки:

df[meanAp >= 2, ]

#    Scene   Name Appearances
# 3    114 Hitler           4
# 5    115 Hitler           1
# 7    117   John           2
# 10   118   John           2
person Sven Hohenstein    schedule 17.12.2013

Вот альтернатива с "data.table":

library(data.table)
DT <- data.table(df)

DT[, if(mean(Appearances) >= 2) .SD, by = Name]
#      Name Scene Appearances
# 1: Hitler   114           4
# 2: Hitler   115           1
# 3:   John   117           2
# 4:   John   118           2

(Спасибо @thelatemail/@mnel.)

person A5C1D2H2I1M1N2O1R2T1    schedule 18.12.2013