У меня есть таблица данных в 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. Я также должен исключить один и тот же город при сравнении с другими городами штата.
Я не уверен, получил ли я неправильный вывод или в желаемом выводе все еще есть ошибки (например, для 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