假设我有一个数据帧:
x y
a 1
b 2
a 3
a 4
b 5
c 6
a 7
d 8
a 9
b 10
e 12
b 13
c 15
我想创建另一个数据框,其中仅包含至少发生3次的x
值(在这种情况下为a
和b
),以及它们的最高对应{{1值。
所以我希望输出为:
y
此处x y
a 9
b 13
和9
分别是13
和a
的最高值
我尝试使用:
b
但它不起作用。
答案 0 :(得分:7)
data.table
包很适合这个。如果df
是原始数据,则可以执行
library(data.table)
setDT(df)[, .(y = max(y)[.N >= 3]), by=x]
# x y
# 1: a 9
# 2: b 13
.N
是一个整数,它告诉我们每组中有多少行(我们在此设置为x
)。因此,我们只需将max(y)
分组,使.N
至少为三个。
答案 1 :(得分:6)
这是一种方法,使用subset
省略少于3次的x
,然后aggregate
按群组查找最大值:
d <- read.table(text='x y
a 1
b 2
a 3
a 4
b 5
c 6
a 7
d 8
a 9
b 10
e 12
b 13
c 15', header=TRUE)
with(subset(d, x %in% names(which(table(d$x) >= 3))),
aggregate(list(y=y), list(x=x), max))
# x y
# 1 a 9
# 2 b 13
好的衡量标准是dplyr
方法:
library(dplyr)
d %>%
group_by(x) %>%
filter(n() >= 3) %>%
summarise(max(y))
# Source: local data frame [2 x 2]
#
# x max(y)
# 1 a 9
# 2 b 13