2017-11-19 4 views
1

私は2つのカテゴリ変数、locationとemploystatusを持つデータフレーム(dfdat)を持っています。dplyrとtidyrで長いフォーマットから長いフォーマットへ行くときに予期しない行

私は、各場所の雇用状況の割合でデータフレームを生成したいと思います。

mydf_wide(達成された結果)は、私が探しているものです。問題は、employstatusは2つのレベルの変数ですが、mydf_wideには3つの行があります。なぜ私はmytable(予想される結果)に似た何かを期待していたので、私はそれがなぜであるか分からない。

ご協力いただければ幸いです。

開始点(DF):

dfdat <- data.frame(location=c("GA","GA","MA","OH","RI","GA","AZ","MA","OH","RI"),employmentstatus=c(1,2,1,2,1,1,1,2,1,1)) 

期待される成果(表):

mytable <- table(dfdat$employmentstatus,dfdat$location) 
mytable <- round(100*(prop.table(mytable, 2)),1) 

達成結果(DF):

library(dplyr) 
mydf <- dfdat %>% 
group_by(location,employmentstatus) %>% 
summarise (n = n()) %>% 
mutate(freq = round((n/sum(n)*100),1)) 

library(tidyr) 
mydf_wide <- spread(mydf, location, freq) 
mydf_wide <- as.data.frame(mydf_wide) 

答えて

0

は、我々は、第二を行う必要がありgroup_by 「場所」を使用してsumを取得します。代わりにグループ化すると、その後の「n」を作成し、我々はOPのコードを使用している場合にも、count機能が

dfdat %>% 
    count(location, employmentstatus) %>% 
    group_by(location) %>% 
    mutate(n = round(100*n/sum(n), 2)) %>% 
    spread(location, n, fill = 0) 
# A tibble: 2 x 6 
# employmentstatus AZ GA MA OH RI 
#*   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
#1    1 100 66.67 50 50 100 
#2    2  0 33.33 50 50  0 

を使用することができ、その後、「n」の列を削除してからspread

を行います
dfdat %>% 
    group_by(location,employmentstatus) %>% 
    summarise (n = n()) %>% 
    mutate(freq = round((n/sum(n)*100),1)) %>% 
    select(-n) %>% 
    spread(location, freq, fill =0) 

を入力するか、出力がround、次にspreadの「n」列を更新してください。 'n'の余分な列は、その組み合わせがデータセットに存在することを確認しました

関連する問題