r - 使用 dplyr 和条件对数据框进行子集化
问题描述
我有一个数据框,例如:
Groups Name names2 Category value
G1 A habit1 cat1 20
G1 A habit2 NA 1
G1 B habit3 NA 100
G1 B habit4 cat3 23
G2 A habit5 cat4 32
G2 C habit6 NA 100
G2 C habit7 cat2 21
G2 D habit8 cat3 34
G2 D habit9 cat5 43
Groups
我只想保留一行Name
并得到:
Groups Name names2 Category value
G1 A habit1 cat1 20
G1 B habit4 cat3 23
G2 A habit5 cat4 32
G2 C habit7 cat2 21
G2 D habit9 cat5 43
其中Group
anName
中获胜的行是names2
(不是 a NA
)中有信息的行,如果全部有信息,则具有最高 Value 的行获胜(as G2-D vs G2-D)
42 获胜,因为42 > 34
如果只有NA
,则保留最好的行反正值。
谢谢您的帮助
解决方案
你需要的group_by
是filter
然后top_n
:
library(dplyr)
my.df %>%
group_by(Groups, Name) %>%
filter(!is.na(Category)) %>%
top_n(1, value)
# A tibble: 5 x 5
# Groups: Groups, Name [5]
# Groups Name names2 Category value
# <chr> <chr> <chr> <chr> <int>
# 1 G1 A habit1 cat1 20
# 2 G1 B habit4 cat3 23
# 3 G2 A habit5 cat4 32
# 4 G2 C habit7 cat2 21
# 5 G2 D habit9 cat5 43
但是,这将排除该名称、组组合的所有条目中缺少类别的组,并且如果存在多个最大值,则保留所有最大值。
数据
my.df <- structure(list(Groups = c("G1", "G1", "G1", "G1", "G2", "G2", "G2", "G2", "G2"),
Name = c("A", "A", "B", "B", "A", "C", "C", "D", "D"),
names2 = c("habit1", "habit2", "habit3", "habit4", "habit5", "habit6", "habit7", "habit8", "habit9"),
Category = c("cat1", NA, NA, "cat3", "cat4", NA, "cat2", "cat3", "cat5"),
value = c(20L, 1L, 100L, 23L, 32L, 100L, 21L, 34L, 43L)),
class = "data.frame", row.names = c(NA, -9L))
推荐阅读
- excel - 查找特定字符的第一个实例并使用 vba 获取左值
- clojure - 有没有办法内联传递给宏的函数?
- python - 从路由器使用 ncclient 发送修改后的数据,它是如何工作的?
- bash - 使用 pgrep 而不是 ps 获取内存使用百分比
- c - 为什么获取数组长度的 sizeof 函数在我的函数中不起作用?
- c# - 来自不同来源的 EF Core 实体继承,没有鉴别器
- algorithm - 实现极小极大算法
- python - 如何使用 selenium python 在网站中抓取 ::before 元素
- python - 如何在 Python 中模拟随机访问文件
- preg-match-all - preg 匹配所有重复模式