【问题标题】:bind_rows for each result of a function in RR中函数的每个结果的bind_rows
【发布时间】:2018-03-30 21:21:10
【问题描述】:

我想为我的每个节点创建一个包含 1 行的 data_frame。

library(tidyverse)
library(xml2)

nodeToDf <- function(theNode) {
  # More complex stuff here. But in the end it returns a data_frame with 1 row
  xml_attrs(theNode) %>%
    map_dfr(~as.list(.))
}  

data <- read_xml("<root><book title='First' pages='100'/><book title='Second' pages='100'/><book title='Third' pages='100'/></root>")
books <- xml_find_all(data, "//book")
map_df(books,nodeToDf)
# Error in bind_rows_(x, .id) : Argument 1 must have names

所以我的问题是如何通过为每个节点调用 nodeToDf 来为 myNodeSet 中的每个节点获取一个包含 1 行的 data_frame?

【问题讨论】:

  • 您能否分享一些示例输入以使其可重现?另外,最好提及您正在使用的软件包。 xmlxml2 有不同的接口,可能还有其他处理 XML 的包。而且我可以告诉你正在使用purrr,但是很高兴再次说出它。
  • 或者更好的是包括所有library 行。
  • 是的,对不起。现在应该可以执行了
  • bind_rows(nodeToDf(books[1]), nodeToDf(books[2]), nodeToDf(books[3])) 给出了想要的结果,但我现在不知道会有多少节点

标签: r function rbind


【解决方案1】:

尝试使用 rbind

rbind(myNodeset,nodeToDf)

【讨论】:

  • rbind 给我一个错误:rbind(books, nodeToDf) 中的错误:无法将类型“闭包”强制转换为“列表”类型的向量
  • 你必须确保 book 和 nodeToDf 有相同的 class ,在你的 R 控制台中使用 "class(books)" 和 "class(nodeToDf)" 来检查。
  • books 是一个 xml_nodeset 而 nodeToDf 是一个 function
  • try"rbind(as.dataframe(xml_attrs(books)),as.dataframe(nodeToDf))"
  • @BasJansen 得到的错误是意料之中的。此结果要求您绑定一个函数和一个 xml_nodeset。这是行不通的
【解决方案2】:

正如 OP 评论所说,以下会产生所需的结果,但他/她不知道会有多少行:

bind_rows(nodeToDf(books[1]), nodeToDf(books[2]), nodeToDf(books[3]))
# A tibble: 3 x 2
  title  pages
  <chr>  <chr>
1 First  100  
2 Second 100  
3 Third  100 

您的函数已经可以处理任意数量的行,请参阅:

nodeToDF(books)
# A tibble: 3 x 2
  title  pages
  <chr>  <chr>
1 First  100  
2 Second 100  
3 Third  100 

函数体中的最后一行 map_dfr(~as.list(.)) 完全符合您的要求。获取列表的元素,并将它们作为数据框的行绑定在一起(与 map_dfc 相比,它将它们绑定为列)。

【讨论】:

    猜你喜欢
    • 2022-07-25
    • 1970-01-01
    • 2016-05-09
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2017-08-10
    • 2021-09-11
    相关资源
    最近更新 更多