[英]Row names & column names in R
以下函數對是否生成完全相同的結果?
對1) names()
和colnames()
對2) rownames()
row.names()
正如奧斯卡王爾德所說
一致性是缺乏想象力的最后避難所。
R更像是一種進化而非設計的語言,所以這些事情發生了。 names()
和colnames()
適用於data.frame
但names()
不適用於矩陣:
R> DF <- data.frame(foo=1:3, bar=LETTERS[1:3])
R> names(DF)
[1] "foo" "bar"
R> colnames(DF)
[1] "foo" "bar"
R> M <- matrix(1:9, ncol=3, dimnames=list(1:3, c("alpha","beta","gamma")))
R> names(M)
NULL
R> colnames(M)
[1] "alpha" "beta" "gamma"
R>
只是為了擴展Dirk的例子:
將數據幀視為具有相等長度向量的列表是有幫助的。 這可能就是為什么names
適用於數據框但不適用於矩陣的原因。
另一個有用的函數是dimnames
,它返回每個維度的名稱。 你會發現, rownames
函數實際上只是返回從第一個元素dimnames
。
關於rownames
和row.names
:我無法分辨出來,雖然rownames
使用dimnames
而row.names
寫R.之外他們都似乎也具有較高的二維數組的工作:
>a <- array(1:5, 1:4)
> a[1,,,]
> rownames(a) <- "a"
> row.names(a)
[1] "a"
> a
, , 1, 1
[,1] [,2]
a 1 2
> dimnames(a)
[[1]]
[1] "a"
[[2]]
NULL
[[3]]
NULL
[[4]]
NULL
我覺得用colnames
和rownames
是很有道理的; 這就是原因。
使用names
有幾個缺點。 你必須記住它意味着“列名”,它只適用於數據框,所以你需要在使用矩陣時調用colnames
。 通過調用colnames
,您只需要記住一個函數。 最后,如果你看一下colnames
的代碼,你會看到它無論如何都會在數據框的情況下調用names
,因此輸出是相同的。
rownames
和row.names
返回數據幀和矩陣相同的值; 我發現的唯一區別是,如果沒有任何名稱, rownames
將打印“NULL”(與colnames
),但row.names
將無形地返回。 由於沒有太多的兩種功能之間進行選擇, rownames
勝美學的理由,因為這對更嬌滴滴與colnames
。 (另外,對於懶惰的程序員,你可以保存輸入的字符。)
另一個擴展:
# create dummy matrix
set.seed(10)
m <- matrix(round(runif(25, 1, 5)), 5)
d <- as.data.frame(m)
如果要分配新的列名,可以在data.frame
上執行以下data.frame
:
# an identical effect can be achieved with colnames()
names(d) <- LETTERS[1:5]
> d
A B C D E
1 3 2 4 3 4
2 2 2 3 1 3
3 3 2 1 2 4
4 4 3 3 3 2
5 1 3 2 4 3
但是,如果你在matrix
上運行上一個命令,你就會搞砸了:
names(m) <- LETTERS[1:5]
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 3 2 4 3 4
[2,] 2 2 3 1 3
[3,] 3 2 1 2 4
[4,] 4 3 3 3 2
[5,] 1 3 2 4 3
attr(,"names")
[1] "A" "B" "C" "D" "E" NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[20] NA NA NA NA NA NA
由於矩陣可以被視為二維向量,因此您只需將名稱分配給前五個值(您不想這樣做,是嗎?)。 在這種情況下,你應該堅持使用colnames()
。
那么......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.