Почему mutate_at генерирует неправильные оценки?

#r #dplyr

#r #dplyr

Вопрос:

У меня есть набор данных «gf» со списком переменных «v», которыми я манипулирую. Сначала я использую mutate_at, чтобы умножить каждую переменную в «v» на 1000, а затем разделить ее на gf $ лет. Эта часть кода работает отлично:

 v = c("Public_Welf_Total_Exp", "Welf_Cash_Total_Exp", "Welf_Cash_Cash_Assist", "Welf_Ins_Total_Exp","Total_Educ_Direct_Exp", "Higher_Ed_Total_Exp",
 "Welf_NEC_Cap_Outlay","Welf_NEC_Direct_Expend", "Welf_NEC_Total_Expend", "Total_Educ_Assist___Sub", "Health_Total_Expend", "Total_Hospital_Total_Exp",
 "Welf_Vend_Pmts_Medical","Hosp_Other_Total_Exp","Unemp_Comp_Total_Exp", "Unemp_Comp_Cash___Sec", "Total_Unemp_Rev", "Hous___Com_Total_Exp", "Hous___Com_Construct", "Total_Expenditure", "Total_IG_Expenditure", "Direct_Expenditure")

gf = gf %>% group_by(FIPS_State, FIPS_County) %>% mutate_at(v, ~ ifelse(. !=0, (. *1000)/gf$years, .)) %>% ungroup() 
 

Однако непосредственно под этим кодом я запускаю следующую строку, которая должна делить переменные в «v» на gf $ Population, но она вычисляет неправильные оценки, и я понятия не имею, почему:

 gf = gf %>% group_by(FIPS_State, FIPS_County) %>% mutate_at(v, ~ ifelse(. !=0, (. / gf$Population), .)) %>% ungroup()
 

Кто-нибудь может выяснить, что не так с этим кодом? Заранее спасибо!


Ниже приведены первые 4 строки «gf», прежде чем я запущу обе команды mutate_at:

 dput(gf[1:4, ]) 
structure(list(FIPS_State = c(1L, 1L, 1L, 1L), FIPS_County = c(1, 
3, 5, 7), Public_Welf_Total_Exp = c(1396, 5770, 1369, 1020), 
    Welf_Cash_Total_Exp = c(0, 14, 0, 0), Welf_Cash_Cash_Assist = c(0, 
    14, 0, 0), Welf_Ins_Total_Exp = c(0, 0, 0, 0), Total_Educ_Direct_Exp = c(0, 
    1166, 285, 0), Higher_Ed_Total_Exp = c(0, 0, 0, 0), Welf_NEC_Cap_Outlay = c(0, 
    432, 5, 8), Welf_NEC_Direct_Expend = c(1382, 5720, 1260, 
    1020), Welf_NEC_Total_Expend = c(1382, 5723, 1369, 1020), 
    Total_Educ_Assist___Sub = c(0, 0, 0, 0), Health_Total_Expend = c(1166, 
    9386, 777, 394), Total_Hospital_Total_Exp = c(4, 8305, 0, 
    1656), Welf_Vend_Pmts_Medical = c(0, 0, 0, 0), Hosp_Other_Total_Exp = c(4, 
    0, 0, 1656), Unemp_Comp_Total_Exp = c(0, 0, 0, 0), Unemp_Comp_Cash___Sec = c(0, 
    0, 0, 0), Total_Unemp_Rev = c(0, 0, 0, 0), Hous___Com_Total_Exp = c(2106, 
    7364, 5900, 0), Hous___Com_Construct = c(328, 2593, 4732, 
    0), Total_Expenditure = c(267027, 1961849, 210770, 56991), 
    Total_IG_Expenditure = c(25832, 20884, 16994, 4432), Direct_Expenditure = c(241195, 
    1940965, 193776, 52559), Population = c(34730.7272727273, 
    100775.142857143, 25895.6666666667, 16446.8333333333), years = c(21, 
    21, 21, 20)), row.names = c(NA, -4L), class = c("tbl_df", 
"tbl", "data.frame"))
 

Комментарии:

1. Я предполагаю gf$Population , что это проблема. Вы уже указали gf %>% ... в начале, поэтому можете просто захотеть Population вместо этого.

2. вы абсолютно правы — спасибо!!

3. Это действительно так? Хотя вы не должны использовать gf$ в dplyr каналах, но меняет ли это вычисления здесь?. Я даже не понимаю, зачем вам это нужно group_by .

4. по-видимому, когда я пробую это без «gf $», это работает — не уверен, почему это также влияет на вычисления. Кроме того, вы правы — мне не нужен group_by для этой строки! Спасибо