Если нам нужно подать заявку на несколько столбцов, используйте 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))