首页 > 解决方案 > 如何获得唯一 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

标签: r

解决方案


使用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)

推荐阅读