今天我得到了一個奇怪的結果。移調相同的物體
要複製它,請考慮以下的數據幀:
x <- data.frame(x=1:3, y=11:13)
y <- x[1:3, 1:2]
他們都應該是,實際上是相同的:
identical(x,y)
# [1] TRUE
應用t()
到張玉峯對象應產生相同的結果,但:
identical(t(x),t(y))
# [1] FALSE
區別在於列名稱:
colnames(t(x))
# NULL
colnames(t(y))
# [1] "1" "2" "3"
鑑於此,如果你想按列堆棧y
,你得到你所期望的:
stack(as.data.frame(t(y)))
# values ind
# 1 1 1
# 2 11 1
# 3 2 2
# 4 12 2
# 5 3 3
# 6 13 3
同時:
stack(as.data.frame(t(x)))
# values ind
# 1 1 V1
# 2 11 V1
# 3 2 V2
# 4 12 V2
# 5 3 V3
# 6 13 V3
在後一種情況下, as.data.frame()
找不到原始列名稱並自動生成它們。
罪魁禍首是as.matrix()
,由t()
叫:
rownames(as.matrix(x))
# NULL
rownames(as.matrix(y))
# [1] "1" "2" "3"
一種解決方法是設置rownames.force
:(並相應地重寫stack(...)
調用)
rownames(as.matrix(x, rownames.force=TRUE))
# [1] "1" "2" "3"
rownames(as.matrix(y, rownames.force=TRUE))
# [1] "1" "2" "3"
identical(t(as.matrix(x, rownames.force=TRUE)),
t(as.matrix(y, rownames.force=TRUE)))
# [1] TRUE
我的問題是:
爲什麼
as.matrix()
對待不同x
和y
和你怎麼能告訴他們有什麼區別?
注意,其他信息功能不x, y
之間發現差異性:
identical(attributes(x), attributes(y))
# [1] TRUE
identical(str(x), str(y))
# ...
#[1] TRUE
評論到解決方案
Konrad Rudolph給出了一個簡潔而有效的解釋,上述行爲(見mt1022 更多細節)。
總之康拉德表明:
一個)x
和y
是內部不同;
b)「identical
太簡直太默認了」來捕捉這個內部差異。
現在,如果你把一組S
,其中有的S
,然後S
和T
所有元素的一個子集T
是完全一樣的對象。所以,如果你把一個數據幀y
,其中有所有行和x
,然後x
和y
列應完全相同的對象。不幸的是x \neq y
!
這種行爲不僅是違反直覺,而且是混淆的,也就是說差異不是不言自明,而只有內部甚至默認identical
函數看不到它。
另一個自然原理是轉置兩個相同的(類矩陣)對象產生相同的對象。再次,這是因爲在轉位之前,identical
是「過於寬鬆」的事實打破了;轉置後,默認identical
足以看出差異。
恕我直言,這種行爲(即使它是不是一個錯誤)是一個科學的語言如R.
希望這篇文章將推動一些關注和將R團隊將考慮修改其錯誤行爲。
似乎是如何定義'row.names',因爲它們在'dput(x)'和'dput(y')中是不同的。在使用''[.data.frame'' – user20650
時可能會明確添加它們您可以使用dput(x)和dput(y),您將看到row.names以不同的方式存儲。我認爲它與自動row.names處理有關(查看https://stat.ethz.ch/R-manual/R-devel/library/base/html/row.names.html詳細信息部分獲取更多信息),不知道爲什麼子集返回不同的row.names儘管...說實話,它聞起來像一個意想不到的行爲 – digEmAll
'相同(x,y,attrib.as.set = FALSE)'似乎在差異(注意到'*注意,相同的(x,y,FALSE,FALSE,FALSE,FALSE)會精確測試其是否相等。「* – user20650