我正在通过书中的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正在放弃元素,或者为实现相同目标的替代方案?
答案 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)
希望这有助于其他人