2016-10-19 15 views
1

加重データを含むグループ別に2種類の頻度テーブルを計算したいと考えています。加重データを含むグループ別の頻度テーブルR

次のコードで再現性のあるデータを生成することができます:まず

Data <- data.frame(
    country = sample(c("France", "USA", "UK"), 100, replace = TRUE), 
    migrant = sample(c("Native", "Foreign-born"), 100, replace = TRUE), 
    gender = sample (c("men", "women"), 100, replace = TRUE), 
    wgt = sample(100), 
    year = sample(2006:2007) 
    ) 

、私は国や年によって(ネイティブVS外国生まれ)移民ステータスの頻度表を計算してみてください。私は、パッケージquestionrplyrを使用して、次のコードを書いた:

db2006 <- subset (Data, year == 2006) 
db2007 <- subset (Data, year == 2007) 

result2006 <- as.data.frame(cprop(wtd.table(db2006$migrant, db2006$country, weights=db2006$wgt),total=FALSE)) 
result2007 <- as.data.frame(cprop(wtd.table(db2007$migrant, db2007$country, weights=db2007$wgt),total=FALSE)) 

result2006<-rename (result2006, c(Freq = "y2006")) 
result2007<-rename (result2007, c(Freq = "y2007")) 

result <- merge(result2006, result2007, by = c("Var1","Var2")) 

私の本当のデータベースでは、それはすべての年のために、このコードを適用するには時間がかかるので、私は10年以上持っています。誰かがそれを行うより速い方法を知っていますか?

私はまた、移住者の地位に占める女性と男性の国と地域別のシェアを計算したいと考えています。私は次のようなものを探しています:

Var1   Var2  Var3  y2006 y2007 
Foreign born France men  52  55 
Foreign born France women  48  45 
Native   France men  51  52 
Native   France women  49  48 
Foreign born UK  men  60  65 
Foreign born UK  women  40  35 
Native   UK  men  48  50 
Native   UK  women  52  50 

私はこれらの結果をどのように得ることができるのでしょうか?

答えて

0

あなたはこれを行うことができます:既に書いたコードで関数を作る。 lapplyを使用して、データ内のすべての年にわたってその関数を繰り返します。 Reducemergeを使用して、結果のリストを1つのデータフレームにまとめます。このように:

# let's make your code into a function called 'tallyho' 
tallyho <- function(yr, data) { 

    require(dplyr) 
    require(questionr) 

    DF <- filter(data, year == yr) 

    result <- with(DF, as.data.frame(cprop(wtd.table(migrant, country, weights = wgt), total = FALSE))) 

    # rename the last column by year 
    names(result)[length(names(result))] <- sprintf("y%s", year) 

    return(result) 

} 

# now iterate that function over all years in your original data set, then 
# use Reduce and merge to collapse the resulting list into a data frame 
NewData <- lapply(unique(Data$year), function(x) tallyho(x, Data)) %>% 
    Reduce(function(...) merge(..., all=T), .) 
+0

TIL about 'Reduce()' – roman

+0

回答には多くの感謝の@ulfelderが、私はそれにいくつかの問題を抱えていました。私がコードを実行すると、2006年と2007年の結果はまったく同じですが、これは正しくありません。どうすれば改善できるのか分かりますか?性別に関する情報をどのように追加することができますか? –

+0

申し訳ありません、投稿したばかりの編集版をお試しください。私は、関数の入力に列と同じ名前を付けることによって 'dplyr'を混乱させていたと思います。残念ながら、私はあなたがこのアプローチにジェンダーを加えることはできないと思っています。「wtd.table」は双方向のクロス集計を可能にするだけであるためです。そして、私は、これらの重みが代替ソリューションを提案するために何をしているのか十分に分かっていません。 – ulfelder

関連する問題