2017-11-17 6 views
0

私は簡単な作業で助けが必要だと私は信じています。私はRの関数にそれほど慣れていません。 2つのデータフレーム(df1とdf2)があり、私は次のようにしたいと思います:ピボットテーブルの機能とマージR

1)df1を列値(出力= A)でフィルタリングします。 2)A(出力= B)からピボットテーブルを生成する。

3)Bの列の名前を変更します。 4)このピボットテーブルBを第2のデータフレームdf2(出力= C)とマージする。

5)私はこの作業を13回実行したい

C.

から列の値によってDF2から列の値を分割、それは私が function/ loop/ lapplyを使用したいと思っ理由です私の人生を楽にしてくれるようなやり方があります。

私が見るように、Rでは通常、lapplyを使用する方が良いです。直感的に、私はこの仕事のために何らかの種類の関数またはループを使用します。

2つの変数(MLBとD)の再現可能な例を以下で確認してください。

library(dplyr) 
df<- as.data.frame(cbind(c("NC_1","NC_1","NC_2","NC_2","NC_2","NC_1","NC_1","NC_1","NC_2","NC_1"), 
       c("MLB","MLB","MLB","MLB","MLB","MLB","D","D","D","D"), 
       c("ATT","ATT","ATT","ATT1","ATT1","ATT1","ATT1","ATT1","ATT1","ATT1"))) 

names(df) <- c("TAG", "ST", "ATR") 
general.table<-table(df$TAG) 
general.table<-as.data.frame(general.table) 
names(general.table) <- c("TAG", "OCC") 

# MLB 

MLB.df<-filter(df, grepl('MLB', ST)) # 1) Filter 
MLB.df.table<-as.data.frame(table(MLB.df$TAG)) # 2) Pivot Table 
names(MLB.df.table)<-c("TAG", "Partial_Score") # 3) Rename 
MLB.df.final.table<-merge(general.table,MLB.df.table,by='TAG', all.x=T) # 4) Merge 
MLB.df.final.table$Partial_Score<-MLB.df.final.table$Partial_Score/general.table$OCC# 5) Divide one column by other 

# D - The same tasks to be performed just like MLB 
D.df<-filter(df, grepl('D', ST)) 
D.df.table<-as.data.frame(table(D.df$TAG)) 
names(D.df.table)<-c("TAG", "Partial_Score") 
D.df.final.table<-merge(general.table,D.df.table,by='TAG', all.x=T) 
D.df.final.table$Partial_Score<-D.df.final.table$Partial_Score/general.table$OCC 

文字列のみを変更することにより、これらの5つのタスクをperformeする方法があるかどうか、私も疑問に思います。例えば、MLBDについて実行されたタスク1)〜5)の唯一の違いは、文字列 "MLB"と "D"だけでした。私はこのMLB、Dと他の11の文字列でベクトルを作成しようとし、assignpasteの関数を使って成功しませんでした。

だから、要するに、私が希望する使用してソリューションを持つことです。

A)機能/ループ。

B)lapply;

C)できる場合は、文字列を変更するだけでMLBDの作業を実行します。

もちろん、1つの解決策で十分です。他は教訓的にRをよりよく理解することに過ぎない。

ありがとうございます。あなたに必要な情報があれば教えてください。

答えて

0

あなたが中間のソリューション、だけ... final.tableのものを必要としない場合、私は次の関数を示唆している:

calc.partial.score <- function(df, general.table, filter.expr) { 
    df %>% 
    filter(grepl(filter.expr, ST)) %>% 
    count(TAG) %>% 
    merge(general.table, by = 'TAG', all.x = T) %>% 
    mutate(Partial_Score = n/OCC) %>% 
    select(-n) 
} 

次のようにそれを使用します。

> calc.partial.score(df, general.table, "MLB") 
    TAG OCC Partial_Score 
1 NC_1 6   0.50 
2 NC_2 4   0.75 

> calc.partial.score(df, general.table, "D") 
    TAG OCC Partial_Score 
1 NC_1 6   0.50 
2 NC_2 4   0.25