如果一起添加的值小于x,则从数据框中删除行

时间:2013-12-17 19:49:52

标签: r dataframe delete-row

我有以下数据框,称之为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,table,nomatch = 0L):'match'需要向量参数”

我使用subset命令尝试了同样的事情:

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

但是我得到了同样的错误:“匹配错误(x,table,nomatch = 0L):'match'需要向量参数”

我在r中使用数据框的经验很少。我该如何执行此操作?任何帮助非常感谢。

2 个答案:

答案 0 :(得分:3)

首先,计算每个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

答案 1 :(得分:1)

这是“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。)