r - 如何获得唯一 ID 的因子级别
问题描述
这是我的数据的一个子集。
ID Direction
100 30761 River
101 30762 Marine
102 30763 Marine
103 30764 Marine
104 30765 River
105 30765 River
106 30766 Marine
107 30766 River
108 30767 River
109 30767 River
110 30768 River
111 30768 River
112 30769 River
113 30769 River
114 30770 River
115 30771 River
116 30772 River
117 30772 River
118 30773 River
119 30773 River
120 30774 River
我想要做的是获得一个具有相同列的 DF,除了每个 ID 只有一行。例如,不是 ID 30767 和 30768 的两行数据,而是像这样的一行:
30767 River
30768 River
但是,ID 30766 对每一行(海洋和河流)具有不同的方向值。对于这个 ID,我想做与上面相同的操作,但相反,为 Direction 列创建一个名为“Both”的新级别
30766 Both
所需的 DF 如下所示:
ID Direction
30761 River
30762 Marine
... ...
30765 River
30766 Both
30767 River
... ...
30773 River
30774 River
解决方案
使用dplyr
包,您可以使用distinct
函数首先获取所有不同的行,然后计算每个 ID 并在计数等于 2 时改变列 Direction 的值。最后,您可以仅选择 ID 和 Direction 列并再次应用distinct
:
library(dplyr)
df %>% group_by(ID) %>%
distinct() %>%
mutate(Count = n()) %>%
mutate(Direction = ifelse(Count == 2,"Both",Direction)) %>%
select(ID, Direction) %>%
distinct()
# A tibble: 14 x 2
# Groups: ID [14]
ID Direction
<int> <chr>
1 30761 River
2 30762 Marine
3 30763 Marine
4 30764 Marine
5 30765 River
6 30766 Both
7 30767 River
8 30768 River
9 30769 River
10 30770 River
11 30771 River
12 30772 River
13 30773 River
14 30774 River
编辑:根据@tmfmnk 的评论进行简化
正如@tmfmnk 在评论中所建议的那样,您可以简化我的答案并通过执行以下操作获得相同的结果:
df %>% group_by(ID) %>%
mutate(Direction = ifelse(n_distinct(Direction) > 1, "Both", Direction)) %>%
slice(1)
推荐阅读
- python - 使用 Python For 循环更新 MySQL 数据库不起作用
- uwp - 如何在命令栏中有多个部分,如照片应用程序
- xaml - UWP FullTrust DotNetCore
- javascript - 无法使用 Lambda 访问 S3 中的数据
- reactjs - React 保持前一个组件的状态并渲染新的状态
- alexa - 在 Alexa Discovery 塔风扇未出现期间
- python - 轴上标签的非科学格式
- html - 将弹性项目扩展到全宽
- elasticsearch - 在 Elasticsearch 中,如何使用空格执行通配符搜索?
- sql-server - T-SQL:无法进行子查询或连接(在定义小部件类型的表上)产生结果集的列标题