2

我正在研究“黑客机器学习”一书中的 UFO 示例,但遇到了一个问题。

我从原始数据中提取了一个城市列表(cities.state),并将其存储在一个包含 61870 个条目的列表中,每个条目都有 2 个元素。IE

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 正在删除元素,或者替代方案来实现相同的目标?

4

2 回答 2

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))]
于 2013-08-21T19:48:04.500 回答
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) 

希望这对其他人有帮助

于 2013-08-22T19:45:57.617 回答