1

data.frame短いベクトルを再利用して、データ フレームの長さに一致させます。

test1 = data.frame(x = 1:5, date = as.Date("2013-05-01"))
  x       date
1 1 2013-05-01
2 2 2013-05-01
3 3 2013-05-01
4 4 2013-05-01
5 5 2013-05-01

chronただし、次のクラスでは機能しないようです。

require(chron)
test2 = data.frame(x = 1:5, time = times("08:00:00"))

Error in data.frame(x = 1:5, time = times("08:00:00")) : 
arguments imply differing number of rows: 5, 1

次のように、手動でリサイクルを行うなどの回避策があります。

test3 = data.frame(x = 1:5, time = times(rep("08:00:00",5)))

しかし、なぜリサイクルは機能しないのでしょうか? ここで何かが足りないのですか、それともどこかにバグがありますか?

4

1 に答える 1

2

data.frameメモのドキュメント:

data.frame に渡されるオブジェクトは同じ数の行を持つ必要がありますが、アトミック ベクトル (is.vector を参照)、因子、および I によって保護された文字ベクトルは、必要に応じて (リスト引数の要素としても含めて) 整数回リサイクルされます。

のソースを見ると、data.frame実際に のチェックを見ることができますis.vector

問題は、あなたのtimesオブジェクトはベクトルですか? 答えはノーです:

is.vector(times("8:00:00"))
# [1] FALSE

どうしてこれなの??is.vectorもう少し教えてください:

is.vector は、x が名前以外の属性を持たない指定されたモードのベクトルである場合に TRUE を返します。それ以外の場合は FALSE を返します。

オブジェクトを詳しく見るtimesと、実際に名前以外の属性があることがわかります。

str(times("8:00:00"))
# Class 'times'  atomic [1:1] 0.333
#  ..- attr(*, "format")= chr "h:m:s"

興味深いことに、Dateオブジェクトもベクトルではありませんdata.frameが、例外があります。

したがって、最終的には、リサイクルルールは実際にはリサイクルの例外である可能性がありdata.frameます。ただし、既に理解したように、回避策は簡単です。

于 2014-08-13T04:55:04.633 に答える