r - 根据存在层次结构的另一列删除一列中的重复项
问题描述
我有一个这样的数据框:
dat1 <- data.frame(Unit = c("a","a","b","c","c","c","d"), Habitat = c("choppy sands","sands","meadow","sands","meadow","choppy sands","choppy sands"), Litter = c(3.7,3.4,5.6,2.1,3.6,7.5,1.2))
>dat1
Unit Habitat Litter
1 a choppy sands 3.7
2 a sands 3.4
3 b meadow 5.6
4 c sands 2.1
5 c meadow 3.6
6 c choppy sands 7.5
7 d choppy sands 1.2
我想根据 Unit 查找和删除重复的行,其中为 Unit 的每个值保留的单行取决于 Habitat 中的值层次结构。如果存在基于单位的重复行,则 Habitat = "meadow" 的行优先,然后是 Habitat = "choppy sands" 的行,然后是 Habitat = "sands" 的行。因此生成的数据框将如下所示:
Unit Habitat Litter
1 a choppy sands 3.7
2 b meadow 5.6
3 c meadow 3.6
4 d choppy sands 1.2
非常感谢任何帮助。
解决方案
使用dplyr
and forcats
(都在tidyverse
软件包系统中),您可以执行以下操作:
dat2 <-
dat1 %>%
mutate(Habitat = fct_relevel(Habitat, c('meadow', 'choppy sands', 'sands'), after=0L)) %>%
group_by(Unit) %>%
filter(as.numeric(Habitat) == min(as.numeric(Habitat)))
这给出了所需的输出。这个想法是你制作Habitat
一个因子变量并在这个变量的级别中编码你的层次结构。然后,(在每个组内),您通过使用规则进行过滤来Unit
保留具有最高优先级的行。Habitat
as.numeric(Habitat) == min(as.numeric(Habitat))
推荐阅读
- delphi - 如何在 FMX.Graphics.TBitmap 上绘制 FMX.Surface.TBitmapSurface
- node.js - 适用于 Nodejs 的 AWS 负载均衡器代理
- php - 逻辑异常:必须返回一个关系实例
- generics - 如何表示 owl 泛型,例如参数类?
- android - AWS Device Farm - 将参数传递给 Robotium 测试脚本 - Android
- excel - 在 Excel IF 语句中提取匹配值
- visual-studio-code - 在VSCode中选择关闭标签时查看打开标签的方法?
- azure - 如何在天蓝色搜索中过滤空字符串
- python - 根据第一个列表元组值删除两个列表中的相同索引元素
- c# - 在 C# 中验证列表