使用频率在R中提取变量

Lea*_*r27 2 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
Run Code Online (Sandbox Code Playgroud)

我想创建另一个数据帧,其中仅包含x发生至少3次(价值ab,在这种情况下),以及它们相应的最高y值.

所以我希望输出为:

x   y
a   9
b   13
Run Code Online (Sandbox Code Playgroud)

这里913它们分别是a和的最高值b

我试过用:

sort-(table(x,y)) 
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

Ric*_*ven 7

这个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至少三人.


jba*_*ums 6

这是一种方法,使用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)

  • `aggregate(y~x,data = with(dat,dat [ave(y,x,FUN = length)> = 3,]),FUN = max)`作为替代,使用类似的逻辑. (3认同)