嗨,我是莎朗·马克利斯,编辑数据和分析总监IDG通信。我在这里做第9集多与R:与purrr包的访问嵌套列表项。
列表可以是更难的事情中的R环绕你的头一个,即使你在语言已经工作了一段时间。数据帧中的“列表中的列”可以是更大的挑战,如果结构不为每个值是相同的。让我告诉你一个例子 - 而且是多么容易对付使用purrr。
首先,数据集。我用鲍勃Rudis的[R geocodio包解析地址。结果回来与纬度和经度嵌套在一个列表列。
这是我跑获取数据的代码。首先,我装我需要的软件包。接下来,我创建了一个tibble - 这是一种特殊类型的tidyverse数据帧的 - 与在波士顿5个旅游景点的名称和地址。最后,我用[R geocodio的批量地址解析函数来获得纬度和经度的地址栏。
让我们来看看有惊鸿一瞥的结果。
你看到第二列,response_results?这是一个列表。让我们来看看这个:
它是5个数据帧的列表。现在让我们研究第一个数据框架——提醒我们需要双括号来查看列表项的内容。
这里有几件事情。纬度是在location.lat列。经度是在location.lng列。并且有两个条目地址,而不是一个,使用2个不同的来源:马萨诸塞州的联邦和波士顿市。这增加了一个额外的挑战,因为我只希望为每个地址,而不是两个一个地理位置。
我们想一下我们要做什么。
我们希望与数据,这恰好是一个列表中的response_results列工作。
而在该列表中的每个项目恰好是一个数据帧。
对于每个数据帧,我们希望得到location.lat列的第一行的值,然后也location.lng栏的第一行。
单独地做这些事情是很基本的。
现在的问题是,我们如何想这样做,对列表中的列的每个数据帧?
像R中几乎一切,有多种方法可以做到这一点。我想展现优雅的答案,使用purrr的modify_depth功能。
首先,我要将response_results列表列保存到一个名为mylist的变量中,这样代码的其余部分更容易阅读。
第一个参数是列表。第二个参数是你想有多深在列表中去,如果你已经有了列表与列出了列表中的号码。第三个参数是你想用做修改函数或公式。
我们想从mylist得到的东西只有1级深。我是怎么知道的?列表中的每一项都是一个数据帧,这就是我们要操作的。
假设我们想要将每个数据帧中的formatted_address列中的每个值都改成小写。第一行是代码:
我修改MYLIST,在深入其中,我想改变的formatted_address柱降低。在一个逗号之后的波浪说:“接下来是一个公式。”该点表示正在修改的每个项目 - 记住,这是每个数据帧1级到我的名单。
你可以看到结果。这是一个像下面的代码回路的等价物。
好的,但是如果我们只是想获得一列的值,而不修改它呢?只要使用列作为值
前两行显示了提取每个数据帧位置值的公式。lat列——波浪号,表示数据框架的点,然后是表示数据框架列的通常方式,用美元符号或双括号。
实际上,它还可以使用引号中的列名作为函数——因此在公式中不首先使用波浪号——正如您在第三行中看到的那样。
我们差不多完成,但是要记住 - 我们希望在每个数据帧只有第一个值,而不是他们两人如果有两个。在我们的结果的每个值是一个矢量 - 记住,在R,甚至一个值是长度1。因此,我们可以使用支架1以获得第一结果的每个数据帧的行中,是否有1或2所述的载体。
现在我们已经得到了我们想要的东西,不过是一个列表。要将其转换为向量,请将结果通过管道传输到purrr的as_vector函数
而已!现在,这是一个简单的任务,向量添加到与发生变异的原始数据帧。
创建纬度载体,打造经度载体,然后将它们添加到原始数据。
这是它为这个情节,感谢收看!对于以上R提示,头向多与R视频网页在go.infoworld.com/morewithR。这是HTTPS去点InfoWorld的点com削减更多的与R,除了R.或全部小写,您可以订阅YouTube上的“做更多的R”。这么久了,希望看到你下一集!