私は巨大なデータフレームを持っています。そのスナップショットを以下に示します。国、変数名(Conva、EMP)、first3に年、次の3列に変数AGR、MFR、SERの値を示します。各国のvarname列の変数とAGR:SER列の値に基づいてConVA / EMPのログを計算したいと思います。データフレームdfの例を以下に示します。
df
国Var年AGRMFR 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 905118106
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のログ値が得られます。しかし、ループまたは関数を作成して、国および年ごとに1つのデータフレーム内のすべてのセクター(AGR、MFR、SER)のログ値を取得したい場合、問題が発生します。セクターごとにループを使用してみましたが、毎回エラーが発生します。セクターごとに実行し、データフレームに値を収集するコードの解決策やヒントはありますか?それ以外の場合は、セクターごとに個別にコードを実行してからマージすることしか考えられませんが、セクターの数が増えると面倒になります。
複数の列を申請する必要がある場合は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
`OPのコードを使用したd形式の同じ出力です
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
これにより、形状変更部分を効果的にスキップします
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))
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加