2016-02-18 65 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 

(等于矢量列表的长度,但缺少大量的数据)。