使用ddply时排除值

时间:2016-05-13 03:23:39

标签: r dataframe plyr

以下是与我使用的数据相似的数据: -

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 函数来创建新的数据框,但是想知道我是否可以在原始数据框上执行此操作。提前谢谢。

2 个答案:

答案 0 :(得分:3)

使用ddply,我们可以使用逻辑条件对&#39;等级&#39;

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

或者dplyr,我们filter&#34;成绩&#34;小于或等于100,然后按&#34;名称&#34;分组,得到&#34;等级&#34; {/ p>的max

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,转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df)),在&#39; i&#39;中创建逻辑条件(Grade <= 100),按&#34;名称&#34;分组,获取&#34}的max 34;级&#34;

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

答案 1 :(得分:1)

您也可以将基础R aggregate用于相同的

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

#  Name Grade
#1 Jane    63
#2  Joy    40