2016-02-18 70 views
2

嘗試將列表扁平化爲矢量我剛剛發現了一個意外的行爲。爲了簡化,讓我們做什麼?unlist提出作爲一個例子:r unlist函數意外的結果

unlist(options()) 

看原來列表大小:

length(unlist(options())) # 69 in my environment 

如果非上市名單保留它的長度?我會這麼認爲,但...

length(unlist(options())) # 79!!! 
length(unlist(options(), use.names = F)) # Another 79 

發生了什麼事?我需要保留列表值,但unlist()給了我一個額外的。

+1

但是'sum(lengths(options()))== 79'。 「unlist」正在做它應該做的事情。一些'list'元素有多個項目。 – A5C1D2H2I1M1N2O1R2T1

+0

謝謝@AnandaMahto。我在一個大數據集中發現了這個「問題」,但是使用了很少的'options()'我看不到它。 –

+0

有時候一個小例子有助於更清楚地看到行爲。我希望我的回答中的例子幫助你澄清了這一點。 – A5C1D2H2I1M1N2O1R2T1

回答

0

這是因爲某些列表元素可能有多個值。因此,unlist正在做它被要求做的事情。

請看下面的例子:

L <- list(1, c(1, 2, 3), 1, c(4, 5)) 
length(L)   # 4  <<< How many list elements are there? 
length(unlist(L)) # 7  <<< How many elements are there within the list? 
lengths(L)  # 1 3 1 2 <<< How many elements are in each list element? 
sum(lengths(L)) # 7  <<< How many elements should we expect from unlist? 

如果你只希望每一個第一個值,你可以提取單獨使用類似:

sapply(L, `[[`, 1) 
# [1] 1 1 1 4 

(等於矢量列表的長度,但缺少大量的數據)。