R删除数据框中索引nrow小于特定值的行
R delete rows in data frame where nrow of index is smaller than certain value
当具有相同索引的行数小于预先指定的值时,我想删除数据框中的某些行。
> fof.6.5[1:15, 1:3]
draw Fund.ID Firm.ID
1 1 1667 666
2 1 1572 622
3 1 1392 553
4 1 248 80
5 1 3223 332
6 2 2959 1998
7 2 2659 1561
8 2 14233 2517
9 2 10521 12579
10 2 3742 1045
11 3 9093 10121
12 3 15681 21626
13 3 26371 70170
14 4 27633 52720
15 4 13751 656
在这个例子中,我希望每个索引有 5 行。第三次抽奖(这是我的索引)少于 5 行。如果少于5行,如何删除像第三个那样的抽奖?
下面的代码使得:
library(dplyr)
fof.6.5 <- data.frame(draw = rep(1:4, c(5, 5, 3, 2)),
Fun.ID = rnorm(15),
Firm.ID = rnorm(15))
fof_filter <- fof.6.5 %>% group_by(draw) %>% mutate(freq = n()) %>%
filter(freq >= 5) %>% select(-freq)
fof_filter
group_by
加入(以某种方式)具有相同 draw 值的配置文件
mutate
添加一个新变量 "freq" 来给出配置文件的数量
每组抽奖并重复。
filter
只选择那些
"freq" 大于或等于 5 的配置文件
select
删除"freq"
列因为不再需要
您可以使用 dplyr
执行此操作(假设您的数据位于名为 dt
:
的数据框中
dt %>% group_by(draw) %>% filter(n() >= 5) %>% ungroup()
或者您可以使用 table
或 xtabs
:
tab <- xtabs(~ draw, dt)
dt[!dt$draw %in% as.numeric(names(which(tab < 5))), ]
这是另一个使用 data.table
的选项。将 'data.frame' 转换为 'data.table'(setDT(df1)
,按 'draw' 分组,if
n行(.N
)大于或等于 'n' 然后得到 Data.table (.SD
)
的子集
library(data.table)
n <- 5
setDT(df1)[, if(.N >= n) .SD, by = draw]
# draw Fund.ID Firm.ID
# 1: 1 1667 666
# 2: 1 1572 622
# 3: 1 1392 553
# 4: 1 248 80
# 5: 1 3223 332
# 6: 2 2959 1998
# 7: 2 2659 1561
# 8: 2 14233 2517
# 9: 2 10521 12579
#10: 2 3742 1045
如果我们只需要 'n' 行数,请使用 head
setDT(df1)[, if(.N >= n) head(.SD, n), by = draw]
当具有相同索引的行数小于预先指定的值时,我想删除数据框中的某些行。
> fof.6.5[1:15, 1:3]
draw Fund.ID Firm.ID
1 1 1667 666
2 1 1572 622
3 1 1392 553
4 1 248 80
5 1 3223 332
6 2 2959 1998
7 2 2659 1561
8 2 14233 2517
9 2 10521 12579
10 2 3742 1045
11 3 9093 10121
12 3 15681 21626
13 3 26371 70170
14 4 27633 52720
15 4 13751 656
在这个例子中,我希望每个索引有 5 行。第三次抽奖(这是我的索引)少于 5 行。如果少于5行,如何删除像第三个那样的抽奖?
下面的代码使得:
library(dplyr)
fof.6.5 <- data.frame(draw = rep(1:4, c(5, 5, 3, 2)),
Fun.ID = rnorm(15),
Firm.ID = rnorm(15))
fof_filter <- fof.6.5 %>% group_by(draw) %>% mutate(freq = n()) %>%
filter(freq >= 5) %>% select(-freq)
fof_filter
group_by
加入(以某种方式)具有相同 draw 值的配置文件
mutate
添加一个新变量 "freq" 来给出配置文件的数量 每组抽奖并重复。filter
只选择那些 "freq" 大于或等于 5 的配置文件
select
删除"freq" 列因为不再需要
您可以使用 dplyr
执行此操作(假设您的数据位于名为 dt
:
dt %>% group_by(draw) %>% filter(n() >= 5) %>% ungroup()
或者您可以使用 table
或 xtabs
:
tab <- xtabs(~ draw, dt)
dt[!dt$draw %in% as.numeric(names(which(tab < 5))), ]
这是另一个使用 data.table
的选项。将 'data.frame' 转换为 'data.table'(setDT(df1)
,按 'draw' 分组,if
n行(.N
)大于或等于 'n' 然后得到 Data.table (.SD
)
library(data.table)
n <- 5
setDT(df1)[, if(.N >= n) .SD, by = draw]
# draw Fund.ID Firm.ID
# 1: 1 1667 666
# 2: 1 1572 622
# 3: 1 1392 553
# 4: 1 248 80
# 5: 1 3223 332
# 6: 2 2959 1998
# 7: 2 2659 1561
# 8: 2 14233 2517
# 9: 2 10521 12579
#10: 2 3742 1045
如果我们只需要 'n' 行数,请使用 head
setDT(df1)[, if(.N >= n) head(.SD, n), by = draw]