Премахнете редовете от рамката с данни, ако сумираните стойности са по-малки от 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
}

но получих грешка: "Грешка в match(x, table, nomatch = 0L): 'match' изисква векторни аргументи"

Опитах същото с командата subset:

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

Но получавам същата грешка: „Грешка в match(x, table, nomatch = 0L): „match“ изисква векторни аргументи“

Имам много малък опит в работата с рамки за данни в 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