使用 ddply 时排除值

Excluding values when using ddply

这是与我正在使用的类似的数据:-

df <- data.frame(Name=c("Joy","Jane","Jane","Joy"),Grade=c(40,20,63,110))

  Name Grade
1  Joy    40
2 Jane    20
3 Jane    63
4  Joy   110

Agg <- ddply(df, .(Name), summarize,Grade= max(Grade))

  Name Grade
1 Jane    63
2  Joy   110

由于成绩不能大于100,我需要40作为Joy的值而不是110。基本上我想在总结时排除所有大于100的值。我可以通过排除值然后应用 ddply 函数来创建一个新的数据框,但想知道我是否可以在我的原始数据框上这样做。提前致谢。

使用ddply,我们可以使用逻辑条件对'Grade'

的值进行子集化
library(plyr)
ddply(df, .(Name), summarise, Grade = max(Grade[Grade <=100]))
# Name Grade
#1 Jane    63
#2  Joy    40

或者用dplyr,我们filter小于等于100的"Grade",然后按"Name"分组,得到max共 "Grade"

library(dplyr)
df %>% 
  filter(Grade <= 100) %>% 
  group_by(Name) %>% 
  summarise(Grade = max(Grade))
#   Name Grade
#  <fctr> <dbl>
#1   Jane    63
#2    Joy    40

或者代替 filter,我们可以在 summarise

中创建逻辑条件
df %>% 
   group_by(Name) %>% 
   summarise(Grade = max(Grade[Grade <=100]))

或用data.table,将'data.frame'转换为'data.table'(setDT(df)),在[=52=中创建逻辑条件(Grade <= 100) ],按"Name"分组,得到"Grade"的max

library(data.table)
setDT(df)[Grade <= 100, .(Grade = max(Grade)), by = Name]
#   Name Grade
#1:  Joy    40
#2: Jane    63

或使用sqldf

library(sqldf)
sqldf("select Name,  
      max(Grade) as Grade 
      from df
      where Grade <= 100 
      group by Name")
#  Name Grade
#1 Jane    63
#2  Joy    40

base R 中,aggregate 的另一种变体是

aggregate(Grade ~ Name, df, subset = Grade <= 100, max)
#  Name Grade
#1 Jane    63
#2  Joy    40

您也可以使用基数 R aggregate 相同

aggregate(Grade ~ Name, df[df$Grade <= 100, ], max)

#  Name Grade
#1 Jane    63
#2  Joy    40