亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何正確使用R中的列表?

如何正確使用R中的列表?

牛魔王的故事 2019-11-21 10:47:46
簡要背景:廣泛使用的許多(大多數?)當代編程語言至少都具有一些共同的ADT(抽象數據類型),特別是,字符串(由字符組成的序列)列表(值的有序集合),以及基于映射的類型(將鍵映射到值的無序數組)在R編程語言中,前兩個分別作為character和實現vector。當我開始學習R時,幾乎從一開始就顯而易見兩件事:list是R中最重要的數據類型(因為它是R的父類data.frame),第二,我至少不了解它們的工作方式,至少不夠好,無法在我的代碼中正確使用它們。一方面,在我看來,R的list數據類型是對映射ADT的直接實現(dictionary在Python中,NSMutableDictionary在Objective C中,hash在Perl和Ruby中,object literal在Javascript中,等等)。例如,通過將鍵值對傳遞給構造函數(在Python中dict不是list)來創建它們,就像創建Python字典一樣:x = list("ev1"=10, "ev2"=15, "rv"="Group 1")然后您就可以像訪問Python字典那樣訪問R列表中的項目,例如x['ev1']。同樣,您可以通過以下方式僅檢索“鍵”或“值”:names(x)    # fetch just the 'keys' of an R list# [1] "ev1" "ev2" "rv"unlist(x)   # fetch just the 'values' of an R list#   ev1       ev2        rv #  "10"      "15" "Group 1" x = list("a"=6, "b"=9, "c"=3)  sum(unlist(x))# [1] 18但是R list也不同于其他映射類型的ADT(無論如何,從我所學的語言中)。我的猜測是,這是S最初規格的結果,即,打算從頭開始設計數據/統計DSL(特定領域語言)。R list和其他廣泛使用的語言(例如Python,Perl,JavaScript)的映射類型之間的三個重要區別:首先,listR中的s是向量一樣的有序集合,即使值是有鍵的(即,鍵可以是任何可散列的值,而不僅是連續的整數)。幾乎總是其他語言的映射數據類型是無序的。第二,listS可從即使你在一個從來沒有通過函數返回list,當你調用的函數,并且即使返回的功能list不包含(明確)list構造函數(當然,你可以解決這個問題在實踐中將返回的結果包裝到unlist)中:x = strsplit(LETTERS[1:10], "")     # passing in an object of type 'character'class(x)                            # returns 'list', not a vector of length 2# [1] list一個第三討論R的獨特功能listS:它似乎并不認為他們可以是另一種ADT的成員,如果你嘗試這樣做,那么主容器被裹挾到list。例如,x = c(0.5, 0.8, 0.23, list(0.5, 0.2, 0.9), recursive=TRUE)class(x)# [1] list我在這里的目的不是批評語言或其記錄方式。同樣,我并不是在暗示list數據結構或其行為有問題。我要做的只是糾正我對它們如何工作的理解,以便可以在代碼中正確使用它們。以下是我想更好地理解的一些內容:有哪些規則確定何時函數調用將返回list(例如,strsplit上面陳述的表達式)?如果我沒有明確分配名稱list(例如list(10,20,30,40)),默認名稱是否只是以1開頭的連續整數?(我假設,但是我不確定答案是否定的,否則我們將無法強制將這種類型的list向量強制為w或對的調用unlist。)為什么這兩個不同的運算符,[]和[[]]返回相同的結果?x = list(1, 2, 3, 4)這兩個表達式都返回“ 1”:x[1]x[[1]]為什么這兩個表達式不能返回相同的結果?x = list(1, 2, 3, 4)x2 = list(1:4)請不要將我指向R文檔(),我已經仔細閱讀了該文檔?list,R-intro它不能幫助我回答上面剛剛提到的問題類型。(最后,我最近了解并開始使用一個R包(在CRAN上可用)hash,該包通過S4類實現常規的映射類型行為;我當然可以推薦此包。)
查看完整描述

3 回答

?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

只是為了解決您問題的最后一部分,因為這實際上指出了R list和vectorR 之間的區別:


為什么這兩個表達式不能返回相同的結果?


x = list(1、2、3、4); x2 =列表(1:4)


列表可以包含任何其他類作為每個元素。因此,您可以擁有一個列表,其中第一個元素是字符向量,第二個元素是數據幀,等等。在這種情況下,您創建了兩個不同的列表。 x有四個向量,每個向量的長度為1。 x2有1個向量的長度為4:


> length(x[[1]])

[1] 1

> length(x2[[1]])

[1] 4

所以這些是完全不同的列表。


R列表非常類似于哈希映射數據結構,因為每個索引值都可以與任何對象關聯。這是一個包含3個不同類(包括一個函數)的列表的簡單示例:


> complicated.list <- list("a"=1:4, "b"=1:3, "c"=matrix(1:4, nrow=2), "d"=search)

> lapply(complicated.list, class)

$a

[1] "integer"

$b

[1] "integer"

$c

[1] "matrix"

$d

[1] "function"

鑒于最后一個元素是搜索功能,我可以這樣稱呼它:


> complicated.list[["d"]]()

[1] ".GlobalEnv" ...

作為對此的最后評論:應該注意,a data.frame實際上是一個列表(來自data.frame文檔):


數據框是具有給定類'“ data.frame”'的具有相同行名稱的具有相同行數的變量的列表


因此,a中的列data.frame可以具有不同的數據類型,而矩陣中的列則不能。例如,在這里我嘗試創建一個由數字和字符組成的矩陣:


> a <- 1:4

> class(a)

[1] "integer"

> b <- c("a","b","c","d")

> d <- cbind(a, b)

> d

 a   b  

[1,] "1" "a"

[2,] "2" "b"

[3,] "3" "c"

[4,] "4" "d"

> class(d[,1])

[1] "character"

請注意我如何無法將第一列的數據類型更改為數字,因為第二列具有字符:


> d[,1] <- as.numeric(d[,1])

> class(d[,1])

[1] "character"


查看完整回答
反對 回復 2019-11-21
?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

關于您的問題,讓我依次解決并舉例:


1)如果return語句添加一個列表,則返回一個列表。考慮


 R> retList <- function() return(list(1,2,3,4)); class(retList())

 [1] "list"

 R> notList <- function() return(c(1,2,3,4)); class(notList())

 [1] "numeric"

 R> 

2)根本沒有設置名稱:


R> retList <- function() return(list(1,2,3,4)); names(retList())

NULL

R> 

3)他們不會返回相同的東西。你的例子給出


R> x <- list(1,2,3,4)

R> x[1]

[[1]]

[1] 1

R> x[[1]]

[1] 1

其中x[1]返回的第一個元素x-這是一樣的x。每個標量都是一個長度為1的向量。另一方面,x[[1]]返回列表的第一個元素。


4)最后,兩者之間是不同的,它們分別創建了一個包含四個標量的列表和一個包含單個元素的列表(碰巧是四個元素的向量)。


分享編輯


查看完整回答
反對 回復 2019-11-21
  • 3 回答
  • 0 關注
  • 782 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號