Создать цикл или функцию для сбора значений нескольких векторов, вычисленных с использованием других значений столбца в кадре данных в другом кадре данных в r? - PullRequest
1 голос
/ 21 сентября 2019

У меня огромный массив данных, снимок которого приведен ниже с указанием страны, имени переменной (Conva, EMP), года в первом3 и значений для переменных AGR, MFR и SER в следующих 3 столбцах.Я хотел бы рассчитать журнал ConVA / EMP на основе переменных в столбце имени переменной и значений в столбцах AGR: SER для каждого года в каждой стране.примерный кадр данных приведен ниже

df

Страна Var Год AGR MFR SER

CHN ConVA 1952 346 921 108

CHN ConVA 1953 342 143 432

CHN EMP 1952 171 432 313

CHN EMP 1953 199 300 432

HKG ConVA 2001 905 118 106

HKG EMP 2001 604 254 320

Я делаю это с помощью следующего кода для AGR: dfagrloglabpr<-select( df, Country, Variable, Year, AGR) %>% spread(Variable, AGR) %>% mutate(AGRLabProd = ConVA/EMP) %>% mutate( LogAGRLabProd= log(AGRLabProd))%>% select(Country, year, LogAGRLabProd)), который выдает мне значения журнала для AGR по желанию.Но если я хочу иметь значения журнала для всех секторов (AGR, MFR, SER) в одном кадре данных по стране и году, создав цикл или функцию, я сталкиваюсь с проблемами.Я пытался использовать циклы по секторам, но каждый раз выдает ошибку.Любые решения или советы для кода, который будет запускать его по секторам и собирать значения в кадре данных?В противном случае я могу думать только о запуске кода отдельно для каждого сектора, а затем о слиянии, но это становится громоздким по мере увеличения числа секторов.

1 Ответ

0 голосов
/ 21 сентября 2019

Если нам нужно подать заявку на несколько столбцов, используйте mutate_at, после группировки по «Страна», «Год» (при условии, что для «ConVA», «EMP» по 1 строке, поднабор столбцов, выбранных в mutate_at и разделите на соответствующее значение, где строка 'EMP', и возьмите log

library(dplyr)   
df1 %>%
     group_by(Country, Year) %>% 
     mutate_at(vars(AGR:SER),  list(LogLabProd = ~ 
                   log(.[Var == 'ConVA']/.[Var == 'EMP'])))
# A tibble: 6 x 9
# Groups:   Country, Year [3]
#  Country Var    Year   AGR   MFR   SER AGR_LogLabProd MFR_LogLabProd SER_LogLabProd
#  <chr>   <chr> <int> <int> <int> <int>          <dbl>          <dbl>          <dbl>
#1 CHN     ConVA  1952   346   921   108          0.705          0.757          -1.06
#2 CHN     ConVA  1953   342   143   432          0.542         -0.741           0   
#3 CHN     EMP    1952   171   432   313          0.705          0.757          -1.06
#4 CHN     EMP    1953   199   300   432          0.542         -0.741           0   
#5 HKG     ConVA  2001   905   118   106          0.404         -0.767          -1.10
#6 HKG     EMP    2001   604   254   320          0.404         -0.767          -1.10

, который является тем же выводом в форме summarise d, используя `OP's code

select( df1, Country, Var, Year, AGR) %>% 
     spread(Var, AGR) %>% 
     mutate(AGRLabProd = ConVA/EMP) %>% 
     mutate( LogAGRLabProd= log(AGRLabProd))%>% 
     select(Country, Year, LogAGRLabProd)
#   Country Year LogAGRLabProd
#1     CHN 1952     0.7047752
#2     CHN 1953     0.5415059
#3     HKG 2001     0.4043607

Если нам не нужно создавать новые столбцы, а только выводить summarise d, тогда используйте summarise_at вместо mutate_at

df1 %>%
     group_by(Country, Year) %>% 
     summarise_at(vars(AGR:SER),  list(LogLabProd = ~ 
                   log(.[Var == 'ConVA']/.[Var == 'EMP'])))
# A tibble: 3 x 5
# Groups:   Country [2]
#  Country  Year AGR_LogLabProd MFR_LogLabProd SER_LogLabProd
#  <chr>   <int>          <dbl>          <dbl>          <dbl>
#1 CHN      1952          0.705          0.757          -1.06
#2 CHN      1953          0.542         -0.741           0   
#3 HKG      2001          0.404         -0.767          -1.10

.мы фактически пропускаем изменяющуюся часть

data

df1 <- structure(list(Country = c("CHN", "CHN", "CHN", "CHN", "HKG", 
"HKG"), Var = c("ConVA", "ConVA", "EMP", "EMP", "ConVA", "EMP"
), Year = c(1952L, 1953L, 1952L, 1953L, 2001L, 2001L), AGR = c(346L, 
342L, 171L, 199L, 905L, 604L), MFR = c(921L, 143L, 432L, 300L, 
118L, 254L), SER = c(108L, 432L, 313L, 432L, 106L, 320L)), 
class = "data.frame", row.names = c(NA, 
-6L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...