3

アメリカでのネーミングの傾向に関するデータを探していました。2008 年に生まれた赤ちゃんの名前のトップ 1000 を取得することができました。データは次の形式でフォーマットされています。

 male.name n.male female.name n.female
 Jacob 22272 Emma 18587
 Michael 20298 Isabella 18377
 Ethan 20004 Emily 17217
 Joshua 18924 Madison 16853
 Daniel 18717 Ava 16850
 Alexander 18423 Olivia 16845
 Anthony 18158 Sophia 15887
 William 18149 Abigail 14901
 Christopher 17783 Elizabeth 11815
 Matthew 17337 Chloe 11699

data.frameと の2 つの変数nameを取得したいgender。これはループで実行できますが、この問題を解決するにはかなり非効率的な方法だと思います。いくつかのreshape機能が私のニーズに合うと思います。

data.frameこのタブ区切りのデータが名前付きで保存されていると仮定しましょうbnames。ループは関数で行うことができます:

 tmp <- character()
  for (i in 1:nrow(bnames)) {
  tmp <- c(tmp, rep(bnames[i,1], bnames[i,2]))
 }

しかし、ベクトルベースのアプローチでこれを達成したいと考えています。助言がありますか?

4

4 に答える 4

5

したがって、簡単なバージョンの 1 つは、data.frame を変換し、rbind()関数を使用して必要なものを取得することです。

dataNEW <- data.frame(bnames[,1],c("m"), bnames[,c(2,3)], c("f"), bnames[,4])
colnames(dataNEW) <- c("name", "gender", "value", "name", "gender", "value")

これにより、次のことが得られます。

          name gender value      name gender value
1        Jacob      m 22272      Emma      f 18587
2      Michael      m 20298  Isabella      f 18377
3        Ethan      m 20004     Emily      f 17217
4       Joshua      m 18924   Madison      f 16853
5       Daniel      m 18717       Ava      f 16850
6    Alexander      m 18423    Olivia      f 16845
7      Anthony      m 18158    Sophia      f 15887
8      William      m 18149   Abigail      f 14901
9  Christopher      m 17783 Elizabeth      f 11815
10     Matthew      m 17337     Chloe      f 11699

今、あなたは使用することができますrbind():

dataNGV <- rbind(dataNEW[1:3],dataNEW[4:6])

これは次のことにつながります。

      name gender value
1        Jacob      m 22272
2      Michael      m 20298
3        Ethan      m 20004
4       Joshua      m 18924
5       Daniel      m 18717
6    Alexander      m 18423
7      Anthony      m 18158
8      William      m 18149
9  Christopher      m 17783
10     Matthew      m 17337
11        Emma      f 18587
12    Isabella      f 18377
13       Emily      f 17217
14     Madison      f 16853
15         Ava      f 16850
16      Olivia      f 16845
17      Sophia      f 15887
18     Abigail      f 14901
19   Elizabeth      f 11815
20       Chloe      f 11699
于 2010-02-03T07:10:20.413 に答える
3

直接ベクトルベースのソリューション(ループを置き換える)は次のようになります

# your data:
bnames <- read.table(textConnection(
"male.name n.male female.name n.female
Jacob 22272 Emma 18587
Michael 20298 Isabella 18377
Ethan 20004 Emily 17217
Joshua 18924 Madison 16853
Daniel 18717 Ava 16850
Alexander 18423 Olivia 16845
Anthony 18158 Sophia 15887
William 18149 Abigail 14901
Christopher 17783 Elizabeth 11815
Matthew 17337 Chloe 11699
"), sep=" ", header=TRUE, stringsAsFactors=FALSE)

# how to avoid loop
bnames$male.name[ rep(1:nrow(bnames), times=bnames$n.male) ]

repそれはあなたがループで行うことを一度に行うことができるという事実に基づいています。

ただし、最終的な結果を得るには、mropaとgd047の回答を組み合わせる必要があります。

または私の解決策で:

data_final <- data.frame(
  name = c(
    bnames$male.name[ rep(1:nrow(bnames), times=bnames$n.male) ],
    bnames$female.name[ rep(1:nrow(bnames), times=bnames$n.female) ]
  ),
  gender = rep(
    c("m", "f"),
    times = c(sum(bnames$n.male), sum(bnames$n.female))
  ),
  stringsAsFactors = FALSE
)

[編集]簡略化:

data_final <- data.frame(
  name = rep(
    c(bnames$male.name, bnames$female.name),
    times = c(bnames$n.male, bnames$n.female)
  ),
  gender = rep(
    c("m", "f"),
    times = c(sum(bnames$n.male), sum(bnames$n.female))
  ),
  stringsAsFactors = FALSE
)
于 2010-02-03T10:21:47.540 に答える
3

(私が正しく理解していれば)mropaのソリューションには、あなたが望むものを得るためにもう1つのステップが必要だと思います

library(plyr)
data <- ddply(dataNGV, .(name,gender), 
      function(x) data.frame(name=rep(x[,1],x[,3]),gender=rep(x[,2],x[,3])))
于 2010-02-03T08:19:45.487 に答える
2

または、http: //github.com/hadley/data-baby-namesから完全な (クリーンアップされた) 赤ちゃんの名前のデータセットをダウンロードします。

于 2010-02-03T14:38:54.097 に答える