Как получить уровень фактора для уникальных идентификаторов - PullRequest
0 голосов
/ 15 января 2020

Вот подмножество моих данных.

     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 с такими же столбцами, за исключением того, что для каждого идентификатора есть только одна строка. Например, вместо двух строк данных для идентификатора 30767 и 30768 одна строка будет выглядеть следующим образом:

30767   River
30768   River

Однако идентификатор 30766 имеет разные значения направления для каждой строки (морской и речной). Для этого идентификатора я хотел бы сделать то же, что и выше, но вместо этого создать новый уровень для столбца Направление под названием «Оба»

30766   Both

Желаемый DF выглядит следующим образом:

ID      Direction
30761   River
30762   Marine
...     ...
30765   River
30766   Both
30767   River
...     ...
30773   River
30774   River

Ответы [ 3 ]

2 голосов
/ 15 января 2020

Используя пакет dplyr, вы можете использовать функцию distinct, чтобы сначала получить все отдельные строки, затем подсчитать для каждого идентификатора и изменить значение столбца Направление, если количество равно 2. Наконец, вы можете выбрать только Столбцы ID и Направления и примените снова 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)
1 голос
/ 15 января 2020

Вот способ использования data.table:

library(data.table) 
setDT(df)
df <- unique(df) 
df[, Direction := ifelse(.N == 2, "Both", Direction), by = ID]
unique(df)

#     ID Direction
#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

data

df <- structure(list(ID = c(30761L, 30762L, 30763L, 30764L, 30765L, 
                              30765L, 30766L, 30766L, 30767L, 30767L, 30768L, 30768L, 30769L, 
                              30769L, 30770L, 30771L, 30772L, 30772L, 30773L, 30773L, 30774L
 ), Direction = c("River", "Marine", "Marine", "Marine", "River", 
                  "River", "Marine", "River", "River", "River", "River", "River", 
                  "River", "River", "River", "River", "River", "River", "River", 
                  "River", "River")), class = "data.frame", row.names = c("100", 
                                                                          "101", "102", "103", "104", "105", "106", "107", "108", "109", 
                                                                          "110", "111", "112", "113", "114", "115", "116", "117", "118", 
                                                                          "119", "120"))
1 голос
/ 15 января 2020

Может быть, мы сначала получим строки unique, а затем создадим условие для проверки частоты уникальных элементов по каждому идентификатору и изменим те, у которых больше 1 на «Оба», снова получим строки unique

df2 <- unique(df1)
i1 <- with(df2, ave(Direction, ID, FUN = function(x) length(unique(x))) == 2)
df2$Direction[i1] <- 'Both'
out <- unique(df2)

данные

df1 <- structure(list(ID = c(30761L, 30762L, 30763L, 30764L, 30765L, 
30765L, 30766L, 30766L, 30767L, 30767L, 30768L, 30768L, 30769L, 
30769L, 30770L, 30771L, 30772L, 30772L, 30773L, 30773L, 30774L
), Direction = c("River", "Marine", "Marine", "Marine", "River", 
"River", "Marine", "River", "River", "River", "River", "River", 
"River", "River", "River", "River", "River", "River", "River", 
"River", "River")), class = "data.frame", row.names = c("100", 
"101", "102", "103", "104", "105", "106", "107", "108", "109", 
"110", "111", "112", "113", "114", "115", "116", "117", "118", 
"119", "120"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...