rの別のデータフレームのデータフレームの他の列値を使用して計算された複数のベクトルの値を収集するためのループまたは関数を作成するには?

シプラ

私は巨大なデータフレームを持っています。そのスナップショットを以下に示します。国、変数名(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)のログ値を取得したい場合、問題が発生します。セクターごとにループを使用してみましたが、毎回エラーが発生します。セクターごとに実行し、データフレームに値を収集するコードの解決策やヒントはありますか?それ以外の場合は、セクターごとに個別にコードを実行してからマージすることしか考えられませんが、セクターの数が増えると面倒になります。

akrun

複数の列を申請する必要がある場合は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

もし私達。新しい列を作成する必要はありませんが、summarised出力のみを作成し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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ