对于R中函数的每个结果的bind_rows

时间:2018-03-30 21:21:10

标签: r function rbind

我想为每个节点创建一个包含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中的每个节点获取一行数据帧?

2 个答案:

答案 0 :(得分:1)

尝试使用rbind

rbind(myNodeset,nodeToDf)

答案 1 :(得分:0)

正如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相比,将它们绑定为列)。