利用频率提取R中的变量

利用频率提取R中的变量,r,data-mining,R,Data Mining,假设我有一个数据帧: 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,在本例中),以及它们对应的最高y值 因此,我希望输出为: x y a 9 b 13 这里9和13分别是a和b的最高值 我尝试使用: sort-(table(x,y)) 但它没有起作用 这里有一种方法,使用子集忽略任何少于3次的x,

假设我有一个数据帧:

 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
,在本例中),以及它们对应的最高
y

因此,我希望输出为:

x   y
a   9
b   13
这里
9
13
分别是
a
b
的最高值

我尝试使用:

sort-(table(x,y)) 

但它没有起作用

这里有一种方法,使用
子集
忽略任何少于3次的
x
,然后
聚合
按组查找最大值:

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

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
至少是三个。

聚合(y~x,data=with(dat,dat[ave(y,x,FUN=length)>=3,]),FUN=max)
作为一种使用类似逻辑的替代方法。@latemail-nice,看起来更赏心悦目。嘿,你知道一种方法吗,我可以先将输出排序为b,然后为a。因为b是13,a是9@Learner27使用
dplyr
可以执行
d%%>%groupby(x)%%>%filter(n()>=3)%%>%summary(y=max(y))%%>%arrange(desc(y))
。使用
base
R方法,可能最容易的方法是先分配,然后重新排序do
d2=3))、聚合(list(y=y)、list(x=x)、max);d2[订单(d2$y,递减=真),]
library(data.table)
setDT(df)[, .(y = max(y)[.N >= 3]), by=x]
#    x  y
# 1: a  9
# 2: b 13