Получить минимальную разницу значений и случай в data.table R

У меня есть таблица данных в R, которая выглядит так:

  State     City City.Population  num.stores
state A   City_1             523           5
state A   City_2             456          NA
state A   City_3            1230          52 
state A   City_4             780          NA
state B   City_5             788          NA
state B   City_6             111          15
state B   City_7             897          NA 
state B   City_8               5          48  

и я хотел бы получить для каждого City другого города num.stores, сравнив население другого города в штате. Например, в City_1 из State A я бы получил, что City 2 из State A будет более похоже по населению, чем City 3, потому что разница между их популяциями составляет 67 (между City_1 и City_2 оба из state A) по сравнению с 707 (City_1 против City_3), поэтому присваивание 5 магазинов до City_2. Мой конечный результат будет выглядеть так:

  State     City City.Population  num.stores  assigned.stores  similar_pop_city
state A   City_1             523           5                5
state A   City_2             456          NA                5            City_1  (City_1 is closer in population and not null)
state A   City_3            1230          52               52 
state A   City_4             780          NA               52            City_1  (City_1 is closer in population and not null)
state B   City_5             788          NA               15            City_6  (City_6 is closer in population and not null)
state B   City_6             111          15               15
state B   City_7             897          NA               15            City_6  (City_6 is closer in population and not null)
state B   City_8               5          48                5  

Я пытался сделать что-то следующим образом, но мне все еще не хватает правильной логики для его выполнения:

d.f[, which.min(City.Population -City.Population), .(State)]

но возвращается только 1-е.

P.D. Я также должен исключить один и тот же город при сравнении с другими городами штата.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не уверен, получил ли я неправильный вывод или в желаемом выводе все еще есть ошибки (например, для City_4 вы назначили City_4 (само себя) как Closest.City).

Я начал с присвоения Closest.City из City, не имеющего NA в num.stores, City, содержащего NA в num.stores. Затем я создал столбец assigned.stores, скопировав num.stores из City с известными num.stores и иначе назначив num.stores из Closest.City.

Данные

State <- c(rep("State A", 4), rep("State B", 4))
City <- c("City_1", "City_2", "City_3", "City_4", "City_5", "City_6", "City_7", "City_8")
City.Population <- c(523, 456, 1230, 780, 788, 111, 897, 5)
num.stores <- c(5, NA, 52, NA, NA, 15, NA, 48)
d.f <- data.frame(State, City, City.Population, num.stores)

Код

d.f %>%
  group_by(State) %>%
  mutate(Closest.City = ifelse(is.na(num.stores),
     apply(sapply(City.Population[!is.na(num.stores)], function(i) abs(i - City.Population[!is.na(num.stores)])), 2, 
                              function(n) City[which(n == sort(n)[2])]), NA)) %>%
  mutate(assigned.stores = ifelse(is.na(num.stores), num.stores[match(Closest.City, City)], num.stores))

Выход

# A tibble: 8 x 6
# Groups:   State [2]
  State   City   City.Population num.stores Closest.City assigned.stores
  <chr>   <chr>            <dbl>      <dbl> <chr>                  <dbl>
1 State A City_1             523          5 NA                         5
2 State A City_2             456         NA City_1                     5
3 State A City_3            1230         52 NA                        52
4 State A City_4             780         NA City_1                     5
5 State B City_5             788         NA City_6                    15
6 State B City_6             111         15 NA                        15
7 State B City_7             897         NA City_6                    15
8 State B City_8               5         48 NA                        48

Другие вопросы по теме