22

"name"私は、米国大統領を含むデータ フレームを持っています。大統領の就任年と終了年 ("from"および"to"列) です。以下にサンプルを示します。

name           from  to
Bill Clinton   1993 2001
George W. Bush 2001 2009
Barack Obama   2009 2012

...そして からの出力dput:

dput(tail(presidents, 3))
structure(list(name = c("Bill Clinton", "George W. Bush", "Barack Obama"
), from = c(1993, 2001, 2009), to = c(2001, 2009, 2012)), .Names = c("name", 
"from", "to"), row.names = 42:44, class = "data.frame")

"name"2 つの列 (と"year") を持つデータ フレームを作成し、大統領が就任した年ごとに行を作成したいと考えています。fromしたがって、「 」から「 」までの毎年の規則的なシーケンスを作成する必要があります"to"。これが私の予想外です:

name           year
Bill Clinton   1993
Bill Clinton   1994
...
Bill Clinton   2000
Bill Clinton   2001
George W. Bush 2001
George W. Bush 2002
... 
George W. Bush 2008
George W. Bush 2009
Barack Obama   2009
Barack Obama   2010
Barack Obama   2011
Barack Obama   2012

1 人の大統領について拡張するために使用できることはわかっていますがdata.frame(name = "Bill Clinton", year = seq(1993, 2001))、大統領ごとに反復する方法がわかりません。

どうすればいいですか?私はこれを知っているべきだと感じていますが、私は空白を描いています。

更新 1

OK、両方の解決策を試しましたが、エラーが発生しました:

foo<-structure(list(name = c("Grover Cleveland", "Benjamin Harrison", "Grover Cleveland"), from = c(1885, 1889, 1893), to = c(1889, 1893, 1897)), .Names = c("name", "from", "to"), row.names = 22:24, class = "data.frame")
ddply(foo, "name", summarise, year = seq(from, to))
Error in seq.default(from, to) : 'from' must be of length 1
4

9 に答える 9

17

これがdata.table解決策です。これには、プレジデントを提供された順序のままにしておくという (マイナーではあるが) 優れた機能があります。

library(data.table)
dt <- data.table(presidents)
dt[, list(year = seq(from, to)), by = name]
#               name year
#  1:   Bill Clinton 1993
#  2:   Bill Clinton 1994
#  ...
#  ...
# 21:   Barack Obama 2011
# 22:   Barack Obama 2012

編集:大統領の任期が連続していない場合は、代わりに次のようにします。

dt[, list(year = seq(from, to)), by = c("name", "from")]
于 2012-07-15T20:00:12.227 に答える
16

plyrパッケージを使用できます:

library(plyr)
ddply(presidents, "name", summarise, year = seq(from, to))
#              name year
# 1    Barack Obama 2009
# 2    Barack Obama 2010
# 3    Barack Obama 2011
# 4    Barack Obama 2012
# 5    Bill Clinton 1993
# 6    Bill Clinton 1994
# [...]

データを年別にソートすることが重要な場合は、次のarrange関数を使用できます。

df <- ddply(presidents, "name", summarise, year = seq(from, to))
arrange(df, df$year)
#              name year
# 1    Bill Clinton 1993
# 2    Bill Clinton 1994
# 3    Bill Clinton 1995
# [...]
# 21   Barack Obama 2011
# 22   Barack Obama 2012

編集 1: 以下の @edgester の「Update 1」、より適切なアプローチは、adply連続していない用語で大統領を説明するために使用することです。

adply(foo, 1, summarise, year = seq(from, to))[c("name", "year")]
于 2012-07-15T18:36:44.493 に答える
2

これが簡単な基本Rソリューションです。あなたの はどこDfですかdata.frame

do.call(rbind, apply(Df, 1, function(x) {
  data.frame(name=x[1], year=seq(x[2], x[3]))}))

行名に関するいくつかの警告が表示されますが、正しいdata.frame.

于 2012-07-16T04:09:05.923 に答える