【问题标题】:How to store trees/nested lists in R?如何在 R 中存储树/嵌套列表?
【发布时间】:2014-03-27 14:25:23
【问题描述】:

我有一个行政区列表和一个地区列表(例如this one)。每个地方恰好位于一个行政区。在 R 中存储这种层次结构的最佳方法是什么,考虑到我希望有一种方便且可读的方式来访问这些,并使用此列表将位置级别的数据累积到自治市镇级别。

我想出了以下几点:

localities <- list("Mitte" = c("Mitte", "Moabit", "Hansaviertel", "Tiergarten", "Wedding", "Gesundbrunnen",
                   "Friedrichshain-Kreuzberg" = c("Friedrichshain", "Kreuzberg")
                  )

但我不确定这是否是最优雅且易于使用的方式。

如果我想分配有关地区级别的其他信息,我可以通过将 c(...) 替换为其他调用来做到这一点,例如 rbind(c('0201', '0202'), c("Friedrichshain", "Kreuzberg")) 如果我想向自治市镇级别添加其他信息(如每个列表的缩写名称和全名),我该怎么做?

编辑:例如,我想将this 之类的表格压缩为一个行政区版本。

【问题讨论】:

  • 罗兰,你应该做一个小reproducible example of your problem
  • @BrodieG:你的意思是我的例子是浓缩的?
  • 可能,虽然那个很复杂,因为那里的数据似乎是一个距离矩阵,所以不像按行政区查找人口那么简单(所以那里有两个问题,我如何压缩数据,以及如何在元素明智的“距离”矩阵中压缩数据)。如果我是你,我会生成一个包含 9 个城市的距离矩阵版本,然后提供这 9 个城市到每个行政区的映射(并可能选择具有 ASCII 字符名称的城市)。
  • R 在我运行您的代码时抛出一个错误,因为逗号放错了位置。以下是使用您的数据创建 2 元素列表的方法:localities &lt;- list("Mitte" = c("Mitte", "Moabit", "Hansaviertel", "Tiergarten", "Wedding", "Gesundbrunnen"), "Friedrichshain-Kreuzberg" = c("Friedrichshain", "Kreuzberg"))
  • 您可能还会发现使用readHTMLTables() 直接从页面中提取数据很有用。下面我举个例子。

标签: r list


【解决方案1】:

如果不更好地了解您打算如何使用它,很难知道,但我强烈建议您从嵌套列表结构转移到数据框结构:

library(reshape2)
loc.df <- melt(localities)               

这就是熔融数据的样子:

           value                       L1
1          Mitte                    Mitte
2         Moabit                    Mitte
3   Hansaviertel                    Mitte
4     Tiergarten                    Mitte
5        Wedding                    Mitte
6  Gesundbrunnen                    Mitte
7 Friedrichshain Friedrichshain-Kreuzberg
8      Kreuzberg Friedrichshain-Kreuzberg

然后您可以使用所有标准数据框和其他计算:

loc.df$population <- sample(100:500, nrow(loc.df))    # make up population
tapply(loc.df$population, loc.df$L1, mean)            # population by borough

给出了自治市镇的平均人口:

Friedrichshain-Kreuzberg                    Mitte 
                278.5000                 383.8333     

对于更复杂的计算,您可以使用 data.table and dplyr

【讨论】:

  • 使用列表有什么好处/坏处?我将添加一个示例。
  • @Roland 大多数允许对表格数据进行简单有效操作的 R 工具都适用于表格(读取数据框)对象,而不是列表。您可以使用列表来做到这一点,但您将向后弯腰以适应现有工具。可能您的特定应用程序将受益于类似列表的处理,但同样,如果没有更好地了解您想要实现的目标,我很难知道。
【解决方案2】:

您可以使用XML 库将所有​​这些数据直接提取到data.frame 中。

library(XML)
theurl <- "http://en.wikipedia.org/wiki/Boroughs_and_localities_of_Berlin#List_of_localities"
tables<-readHTMLTable(theurl)

boroughs<-tables[[1]]$Borough
localities<-tables[c(3:14)]
names(localities) <- as.character(boroughs)
all<-do.call("rbind", localities)

【讨论】:

    【解决方案3】:

    @Roland,我认为您会发现数据框优于列表,原因是前面提到的,还因为您引用的网页上还有其他数据。如果您愿意,加载到数据框将使您更容易走得更远。例如,根据人口密度或页面上“免费”提供的其他项目进行比较将是数据框中的快照。

    【讨论】:

      猜你喜欢
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多