Ранжирование одной переменной по взвешенному значению другой переменной?

Новичок Super R здесь. Я пытаюсь получить рейтинг определенной переменной по взвешенным значениям другого столбца / переменной. Например, у меня есть набор данных, показанный ниже:

State <- rep(c("MN", "MN", "OR", "OR", "ME", "ME", "CO", "CO", "HI", "HI"), each = 3)
PopA <- c("145", "215", "200", "300", "177", "155", "2013", "89", "102", "3451", 
          "565", "805", "204", "650", "975", "145", "2045", "789", "226", "398", 
          "763","346","987","1236","765","876","95","45","3457","4557")
PopB <- c("190", "7410", "523", "963", "1254", "235", "3140", "4041", "896", "7458",
          "105", "40", "5673", "638", "1444", "673", "257", "4211", "869", "245", 
          "8545","8553","8853","234","635","963","3456","6754","234","2244")
inc1 <- c("55000", "67000", "34000", "17000", "135000", "98000", "54000", "55000", "102000", "170000",
          "75000", "12000", "345000", "23000", "13000", "78000", "112000", "48000", "45000", "89000", 
          "10000", "12000", "16000", "23000", "98000", "96000", "34000", "65000", "59000", "39000" ) 
inc2 <- c("23000", "98000", "45000", "92000", "87000", "55000", "29000", "65000", "59000", "155000", 
          "65000", "23000", "95000", "134000", "76000", "69000", "45000", "95000", "230000", "125000",
          "48000", "97000", "65000", "23000", "16000", "76000", "34500", "76000", "98000", "35000")
data <- data.frame(State, PopA, PopB, inc1, inc2)

Я пытаюсь получить 4 новых столбца с именами Complete_rank1_PopA, Total_rank2_PopB, Rank_by_state1_PopA и Rank_by_state2_PopB. В этих столбцах я хочу получить рейтинг inc1 и inc2 по взвешенной совокупности A и взвешенной совокупности B для общего набора данных, а затем также сгруппировать по штатам. Я хочу сделать это с помощью взвешенных процентилей (взвешенных квантилей?) PopA и popB.

В настоящее время у меня есть:

ranking <- data %>%
  arrange(inc1, inc2) %>%
  mutate(overall_rank1 = rank(inc1, ties.method = "average"), overall_rank2 = rank(inc2, ties.method = "average"))

ranking2 <- ranking %>%
  group_by(State)%>%
  mutate(state_rank1 = rank(inc1, ties.method = "average"), 
         state_rank2 = rank(inc2, ties.method = "average"))

Однако это дает мне только порядковые, невзвешенные рейтинги.

Есть у кого-нибудь идеи, как это сделать?


person ayy__bee    schedule 10.11.2020    source источник


Ответы (1)


Шаг 1: удалите все кавычки вокруг целых чисел в исходном фрейме данных (они заставляли их действовать как символы, которые не могли быть ранжированы должным образом)

Шаг 2: создайте новые столбцы для взвешенного прироста населения

data %>% mutate(popAGrowth = inc1/PopA) %>% mutate(popBGrowth = inc2/PopB) -> data

Шаг 3: ранжируйте каждую строку по степени роста (1-е место - это самый высокий процент роста)

data %>% mutate(popAGrowthRank = rank(-popAGrowth)) -> data
data %>% mutate(popBGrowthRank = rank(-popBGrowth)) -> data

Шаг 4: ранжируйте каждое состояние на основе popAGrowth и popBGrowth

data %>% group_by(State) %>% mutate(stateRank1 = rank(-popAGrowth), stateRank2 = rank(-popBGrowth))

Надеюсь, это помогло! (вы можете использовать select () в другом канале, если хотите отказаться от столбцов взвешивания, которые я сделал)

person acoger    schedule 11.11.2020