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