为什么do.call从我的列表中删除行

时间:2013-08-21 19:34:18

标签: r

我正在通过书中的UFO示例"黑客的机器学习"我遇到了一个问题。

我从原始数据中提取了一个城市列表(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控制台中收到任何警告。

任何想法发生了什么,以及为什么.call正在放弃元素,或者为实现相同目标的替代方案?

2 个答案:

答案 0 :(得分: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))]

答案 1 :(得分:0)

在我的情况下,问题是缺失值的组合,一些值被编码为NA。为了强制do.call不丢弃任何内容,我使用以下循环

将行索引添加到我的列表city.state中
for (i in 1:length(city.state)) {
  city.state[[i]] = c(city.state[[i]][1],city.state[[i]][2], i)
}

现在,以下代码不会删除任何值

do.call(rbind, city.state) 

希望这有助于其他人