2016-03-28 18 views
1

は、元のDFです:長形式のデータフレームを、Rのセル内で複数の値を持つワイドフォーマットのデータフレームに変換するにはどうすればよいですか?ここ

area sector  item 
1 East  A  <NA> 
2 South  A  Baidu 
3 South  A Tencent 
4 West  A  <NA> 
5 North  A  <NA> 
6 East  B Microsoft 
7 East  B Google 
8 East  B Facebook 
9 South  B  <NA> 
10 West  B  <NA> 
11 North  B  <NA> 
12 East  C  <NA> 
13 South  C  <NA> 
14 West  C  <NA> 
15 North  C Alibaba 
16 East  D  <NA> 
17 South  D  <NA> 
18 West  D Amazon 
19 North  D  <NA> 
20 East  E  <NA> 
21 South  E  <NA> 
22 West  E  <NA> 
23 North  E  <NA> 

私は、次のいずれかにdfを上記を変換できますか?変換されたdf内のいくつかのセルには元のdfからの複数の項目があります。

Sector      East   South  West  North 
1 A       <NA> "Baidu, Tencent"  <NA>  <NA> 
2 B "Microsoft, Google, Facebook"    <NA>  <NA>  <NA> 
3 C       <NA>    <NA>  <NA> "Alibaba" 
4 D       <NA>    <NA> "Amazon"  <NA> 
5 E       <NA>    <NA>  <NA>  <NA> 

答えて

2

長いから幅広いreshape2パッケージの使用に

reshape2::dcast(df, sector ~ area, toString) 
#Using item as value column: use value.var to override. 
# sector      East North   South West 
# 1  A      <NA> <NA> Baidu, Tencent <NA> 
# 2  B Microsoft, Google, Facebook <NA>   <NA> <NA> 
# 3  C      <NA> Alibaba   <NA> <NA> 
# 4  D      <NA> <NA>   <NA> Amazon 
# 5  E      <NA> <NA>   <NA> <NA> 

をtrasnformingながら、迅速な解決がtoString機能を使用することができこれはほとんどthisのだまされやすい人ですが、解決策のほとんどはそこではないでしょうこのケースのために働く - これはまだあなたにいくつかのアイデアを与えることができます。

2

そして、ちょうど楽しみのために、ここではベースのソリューションです:

reshape(aggregate(item ~ area + sector, data = df, paste, collapse = ","), 
    idvar = "sector", timevar = "area", direction = "wide") 
    sector     item.East item.North item.South item.West 
1  A      <NA>  <NA> Baidu,Tencent  <NA> 
5  B Microsoft,Google,Facebook  <NA>   <NA>  <NA> 
9  C      <NA> Alibaba   <NA>  <NA> 
13  D      <NA>  <NA>   <NA> Amazon 
17  E      <NA>  <NA>   <NA>  <NA> 
1

ここではdplyr/tidyr

library(dplyr) 
library(tidyr) 
df1 %>% 
    group_by(area, sector) %>% 
    summarise(item = toString(item)) %>% 
    spread(area, item) 
とオプションです
関連する問題