我想为每个节点创建一个包含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中的每个节点获取一行数据帧?
答案 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
相比,将它们绑定为列)。