使用 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
这是与我正在使用的类似的数据:-
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