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