簡體   English   中英

R中的行名和列名

[英]Row names & column names in R

以下函數對是否生成完全相同的結果?

對1) names()colnames()

對2) rownames() row.names()

正如奧斯卡王爾德所說

一致性是缺乏想象力的最后避難所。

R更像是一種進化而非設計的語言,所以這些事情發生了。 names()colnames()適用於data.framenames()不適用於矩陣:

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

關於rownamesrow.names :我無法分辨出來,雖然rownames使用dimnamesrow.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

我覺得用colnamesrownames是很有道理的; 這就是原因。

使用names有幾個缺點。 你必須記住它意味着“列名”,它只適用於數據框,所以你需要在使用矩陣時調用colnames 通過調用colnames ,您只需要記住一個函數。 最后,如果你看一下colnames的代碼,你會看到它無論如何都會在數據框的情況下調用names ,因此輸出是相同的。

rownamesrow.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM