2013-08-21 34 views
2

我通过从书“机器学习黑客的” UFO例如工作引出行,我也遇到了问题。为什么do.call从我的名单

我已提取从原始数据城市(cities.state)的列表,并且这被存储在列表中有61870项,其中的每一个有2个元素。即

str(city.state) 
List of 61870 
$ : chr [1:2] "Iowa City" "IA" 
$ : chr [1:2] "Milwaukee" "WI" 
$ : chr [1:2] "Shelton" "WA" 

我想这个列表转换为一个矩阵,这似乎在书中使用,这里其他职位的办法是使用

do.call(rbind, city.state) 

但是当我运行此我得到一个大小为61591x2的矩阵。这个do.call似乎从原始列表中删除了一些行,但我在r控制台中没有收到任何警告。

任何想法正在发生什么,以及为什么do.call是下降的元素,或者替代品达到同样的目的?

+0

很难说没有你的数据。要检查的一件事是确保列表中没有任何项是NULL。 – joran

+0

如果你的意思是这个[file](https://github.com/johnmyleswhite/ML_for_Hackers/tree/master/01-Introduction/data/ufo),它有61393行。也许你从另一个来源得到它?或者在阅读文件时发生错误,这将解释为什么之后出现错误。 – 2013-08-21 20:02:35

+0

我从另一个源文件,该链接似乎并没有为我工作 – Kharoof

回答

0

在我的情况的问题是缺少值的组合和一些值被编码为NA。要强制do.call不放弃任何东西我用下面的循环

for (i in 1:length(city.state)) { 
    city.state[[i]] = c(city.state[[i]][1],city.state[[i]][2], i) 
} 

现在排索引添加到我的清单city.state下面的代码不会丢弃任何值

do.call(rbind, city.state) 

希望这有助于其他

1

此再现错误。你的列表中应该有一些NULL条目。

ll <- list(letters[1:2],letters[1:2],c(NULL,NULL)) 

str(ll) 
List of 3 
$ : chr [1:2] "a" "b" 
$ : chr [1:2] "a" "b" 
$ : NULL 

str(do.call(rbind,ll)) 
chr [1:2, 1:2] "a" "a" "b" "b" 

尝试删除NULL值:

ll[!unlist(lapply(ll,is.null))]