我有以下数据框,称之为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中使用数据框的经验很少。我该如何执行此操作?任何帮助非常感谢。
答案 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。)