如何解决删除每组的数量或行数大于 r 中分组数据框的值的行
我想删除 ID 号大于长度值的所有行。
Tracks <- c("a","a","b","c","c")
Length <- c(2,2,1,2)
ID <- c(1,3,4,2)
df <- data.frame(Tracks,Length,ID)
Tracks Length ID
1 a 2 1
2 a 2 2
3 a 2 3
4 b 1 1
5 b 1 2
6 b 1 3
7 b 1 4
8 c 2 1
9 c 2 2
我使用dplyr包的group_by对我的数据进行分组,打印显示分组成功
df_group <- df %>% group_by(Tracks)
> print(df_group)
# A tibble: 9 x 3
# Groups: Tracks [3]
Tracks Length ID
<chr> <dbl> <dbl>
1 a 2 1
2 a 2 2
3 a 2 3
4 b 1 1
5 b 1 2
6 b 1 3
7 b 1 4
8 c 2 1
9 c 2 2
我尝试使用 head 函数,因为这应该会给我最好的结果。为此,我想用一个函数来定义 n=,该函数返回每个组的长度的最大值
df2 <- head(df_group,n = max(df$Length))
print(df2)
# A tibble: 2 x 3
# Groups: Tracks [1]
Tracks Length ID
<chr> <dbl> <dbl>
1 a 2 1
2 a 2 2
group_modify(df_group,head(df_group,n = max(df$Length)),.keep = TRUE)
Error: Can't convert a `grouped_df/tbl_df/tbl/data.frame` object to function
似乎 head 函数不适用于组,因为它只返回前两行,我尝试使用 group_modify ,但这也不起作用。
有什么想法可以做到这一点吗?
解决方法
试试subset
subset(
df,ID <= Length
)
哪个会给
Tracks Length ID
1 a 2 1
2 a 2 2
4 b 1 1
8 c 2 1
9 c 2 2
,
df_filtered <- df[df$ID <= df$Length,]
这应该可以完成工作。您始终可以以 df[rows,columns]
格式从 data.frame 中选择行和列。在这种情况下,逗号后面的空格仅表示“获取所有列”。
您可以使用 slice
做到这一点:
library(dplyr)
df %>% group_by(Tracks) %>% slice(seq_len(max(Length))) %>% ungroup
# Tracks Length ID
# <chr> <dbl> <dbl>
#1 a 2 1
#2 a 2 2
#3 b 1 1
#4 c 2 1
#5 c 2 2
或filter
:
df %>% group_by(Tracks) %>% filter(ID <= max(Length)) %>% ungroup
,
除了现有的非常好的解决方案之外,还可以使用 which
:我知道逻辑索引是此答案的一部分(由 David 提供)。
df1 <- df[which(!ID > Length),]
output:
> df1
Tracks Length ID
1 a 2 1
2 a 2 2
4 b 1 1
8 c 2 1
9 c 2 2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。