假设我有一个数据帧:
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
Run Code Online (Sandbox Code Playgroud)
我想创建另一个数据帧,其中仅包含x发生至少3次(价值a和b,在这种情况下),以及它们相应的最高y值.
所以我希望输出为:
x y
a 9
b 13
Run Code Online (Sandbox Code Playgroud)
这里9和13它们分别是a和的最高值b
我试过用:
sort-(table(x,y))
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
这个data.table包很棒.如果df是原始数据,您可以这样做
library(data.table)
setDT(df)[, .(y = max(y)[.N >= 3]), by=x]
# x y
# 1: a 9
# 2: b 13
Run Code Online (Sandbox Code Playgroud)
.N是一个整数,告诉我们每组中有多少行(我们在x这里设置了多少行).所以我们只是子集max(y),使得.N至少三人.
这是一种方法,使用subset省略任何x少于3次的方法,然后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
Run Code Online (Sandbox Code Playgroud)
并且为了更好的衡量,一种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
Run Code Online (Sandbox Code Playgroud)