Заменить пропущенные значения наибольшим значением подмножества - PullRequest
0 голосов
/ 21 января 2019

Я хочу написать функцию, которая проходит через мой df и заменяет ячейки в столбце rectangle , которые являются неизвестными значениями "UNK", на идентификатор прямоугольника прямоугольника с наибольшей суммой weight из той же области , что и прямоугольник "UNK".

то есть со следующими данными, я бы хотел, чтобы ячейка прямоугольника "UNK" в первой строке была заменена на "37D5""

area <- c("4.a","4.a","4.a","6.a","4.a","4.a","6.a","6.a","4.a","4.a","4.b","4.a","4.a","4.b","4.b")
rectangle <- c("UNK","37D5","39E1","42E7","37D5","37D5","37D5","38D6","43E8","45F2","40F2","47F0","37D5","49E8","50F0")
weight <- c(1800,200,595,219,517,610,2140,1248,120,492,1085,1278,1759,1902,1862)
trip <- c(1:15)

df1 <- data.frame(area,rectangle,weight,trip)

1 Ответ

0 голосов
/ 21 января 2019

Давайте сначала вычислим отдельную таблицу, содержащую каждый прямоугольник с наибольшим суммированным весом, по area group:

weights <- df1 %>% group_by(area, rectangle) %>% 
  summarize(weight = sum(weight)) %>% 
  filter(weight == max(weight)) %>% 
  select(-weight)

# A tibble: 3 x 2
# Groups:   area [3]
  area  rectangle
  <fct> <fct>    
1 4.a   37D5     
2 4.b   49E8     
3 6.a   37D5

Тогда мы left_join в нашей новой таблице и заменим UNK значения:

df1 %>% 
  left_join(., weights, by = c("area")) %>% 
  mutate(rectangle.x = if_else(rectangle.x == "UNK", rectangle.y, rectangle.x)) %>% 
  select(-rectangle.y) %>% 
  rename(rectangle = rectangle.x)

   area rectangle weight trip
1   4.a      37D5   1800    1
2   4.a      37D5    200    2
3   4.a      39E1    595    3
4   6.a      42E7    219    4
5   4.a      37D5    517    5
6   4.a      37D5    610    6
7   6.a      37D5   2140    7
8   6.a      38D6   1248    8
9   4.a      43E8    120    9
10  4.a      45F2    492   10
11  4.b      40F2   1085   11
12  4.a      47F0   1278   12
13  4.a      37D5   1759   13
14  4.b      49E8   1902   14
15  4.b      50F0   1862   15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...