R 基于每组行数的子集数据帧

R 基于每组行数的子集数据帧,r,dataframe,subset,r-faq,R,Dataframe,Subset,R Faq,我有这样的数据,其中一些“名称”出现三次以上: df <- data.frame(name = c("a", "a", "a", "b", "b", "c", "c", "c", "c"), x = 1:9) name x 1 a 1 2 a 2 3 a 3 4 b 4 5 b 5 6 c 6 7 c 7 8 c 8 9 c 9 我写了这段代码,但无法运行 as.data.frame(table(unique(df)$name)

我有这样的数据,其中一些“名称”出现三次以上:

df <- data.frame(name = c("a", "a", "a", "b", "b", "c", "c", "c", "c"), x = 1:9)

  name x
1    a 1
2    a 2
3    a 3
4    b 4
5    b 5
6    c 6
7    c 7
8    c 8
9    c 9
我写了这段代码,但无法运行

as.data.frame(table(unique(df)$name))
subset(df, name > 3)

首先,两个
base
备选方案。一个依赖于
表格
,另一个依赖于
平均值
长度
。然后,有两种
数据.table
方式


1. <代码>表格
3. <代码>数据。表:
.N
.SD


另请参阅相关问答。

使用
dplyr
软件包:

df %>%
  group_by(name) %>%
  filter(n() < 4)

# A tibble: 5 x 2
# Groups:   name [2]
  name      x
  <fct> <int>
1 a         1
2 a         2
3 a         3
4 b         4
5 b         5
df%>%
分组单位(名称)%>%
过滤器(n()<4)
#一个tibble:5x2
#分组:名称[2]
名称x
1 a 1
2 a 2
3 a 3
4 b 4
5 b 5

n(),然后仅保留属于该组中行数少于4的组的行。

使用
dpylr
包的另一种方法是使用
count
函数,然后在原始数据帧上进行半联接:

library(dplyr)

df %>% 
  count(name) %>%
  filter(n <= 3) %>%
  semi_join(df, ., by = "name")
库(dplyr)
df%>%
计数(名称)%%>%
过滤器(n%
半联接(df,by=“name”)
包“inops”有一些有用的中缀运算符。对于这种特殊情况,#%
中的运算符
%可以根据元素出现的次数选择元素

library(inops)

df[df$name %in#% 1:3,]
返回:

  name x
1    a 1
2    a 2
3    a 3
4    b 4
5    b 5
此处#%1:3中的
df$name%仅对出现1次、2次或3次的元素返回
TRUE
。如果我们希望选择出现4次的元素,我们将执行以下操作:

df[df$name %in#% 4,]
结果如下:

  name x
6    c 6
7    c 7
8    c 8
9    c 9

短得多的是:
df[ave(df$x,df$name,FUN=length)<3,]
@flodel,谢谢!我同意,我只是尽量保持它非常简单,并建立在OP已经尝试过的基础上,因为他们似乎是初学者。我感谢大家的帮助。Henrik的代码完全有意义。它帮助我理解R。flodel的代码现在在阅读Henrik的代码后是可以理解的在
df[,if(.N<3).SD,by=name]
中,没有为每个组调用[.data.table
(与您链接的问题中
.SD
是子集不同)。另一个选项似乎没有更快。使用
df进行测试
df %>%
  group_by(name) %>%
  filter(n() < 4)

# A tibble: 5 x 2
# Groups:   name [2]
  name      x
  <fct> <int>
1 a         1
2 a         2
3 a         3
4 b         4
5 b         5
library(dplyr)

df %>% 
  count(name) %>%
  filter(n <= 3) %>%
  semi_join(df, ., by = "name")
library(inops)

df[df$name %in#% 1:3,]
  name x
1    a 1
2    a 2
3    a 3
4    b 4
5    b 5
df[df$name %in#% 4,]
  name x
6    c 6
7    c 7
8    c 8
9    c 9