7

rbind名前のない data.frames を結合するときに関数が意図したとおりに機能しない理由を理解しようとしています。これが私のテストです:

test <- data.frame(
            id=rep(c("a","b"),each=3),
            time=rep(1:3,2),
            black=1:6,
            white=1:6,
            stringsAsFactors=FALSE
            )

# take some subsets with different names
pt1 <- test[,c(1,2,3)]
pt2 <- test[,c(1,2,4)]

# method 1 - rename to same names - works
names(pt2) <- names(pt1)
rbind(pt1,pt2)

# method 2 - works - even with duplicate names
names(pt1) <- letters[c(1,1,1)]
names(pt2) <- letters[c(1,1,1)]
rbind(pt1,pt2)

# method 3 - works  - with a vector of NA's as names
names(pt1) <- rep(NA,ncol(pt1))
names(pt2) <- rep(NA,ncol(pt2))
rbind(pt1,pt2)

# method 4 - but... does not work without names at all?
pt1 <- unname(pt1)
pt2 <- unname(pt2)
rbind(pt1,pt2)

これは私には少し奇妙に思えます。これがそのままでは機能しない正当な理由がありませんか?

追加情報を編集する

@ JoshO'Brienの提案を使用して、関数のこのステートメント部分でdebugエラーが発生していることを特定できますifrbind.data.frame

if (is.null(pi) || is.na(jj <- pi[[j]]))

(コードのオンライン バージョン: http://svn.r-project.org/R/trunk/src/library/base/R/dataframe.Rで始まる: " ### rbind と cbind のメソッドは次のとおりです。 ")

プログラムをステップ実行すると、piこの時点での値が設定されていないように見えるため、プログラムは組み込み定数piのようなインデックスを作成しようとしてpi[[3]]エラーになります。

私が理解できることから、内部オブジェクトは、次のように初期化されpiたこの前の行のために設定されているようには見えません:clabsNULL

if (is.null(clabs)) clabs <- names(xi) else { #pi gets set here

私はこれを理解しようとして混乱していますが、まとまり次第更新します。

4

1 に答える 1

6

unname()& 列ヘッダーとして NA を明示的に割り当てることは、同一のアクションではないためです。列名がすべて NA の場合、rbind()可能です。rbind()データフレームの名前/列名を取得するため、結果が一致せず、失敗rbind()します。

私が何を意味するかを理解するのに役立つコードを次に示します。

> c1 <- c(1,2,3)
> c2 <- c('A','B','C')
> df1 <- data.frame(c1,c2)
> df1
  c1 c2
1  1  A
2  2  B
3  3  C
> df2 <- data.frame(c1,c2) # df1 & df2 are identical
>
> #Let's perform unname on one data frame &
> #replacement with NA on the other
>
> unname(df1)
  NA NA
1  1  A
2  2  B
3  3  C
> tem1 <- names(unname(df1))
> tem1
NULL
>
> #Please note above that the column headers though showing as NA are null
>
> names(df2) <- rep(NA,ncol(df2))
> df2
  NA NA
1  1  A
2  2  B
3  3  C
> tem2 <- names(df2)
> tem2
[1] NA NA
> 
> #Though unname(df1) & df2 look identical, they aren't
> #Also note difference in tem1 & tem2
>
> identical(unname(df1),df2)
[1] FALSE
> 

これが役立つことを願っています。名前はNAそれぞれに表示されますが、2 つの操作は異なります。

したがって、列ヘッダーが に置き換えられNAた 2 つのデータ フレームは "rbound" にすることができますが、列ヘッダーのない 2 つのデータ フレーム ( を使用して達成unname()) はできません。

于 2012-11-28T07:57:18.973 に答える