我通常将此数据提取到一个csv文件中。这次我不能这样做,因为注释列中的文本太长,如果导出到csv会被截断。如果我导出到xml,那么我可以得到整个文本。但是我在努力处理xml输出。
我正在RStudio中使用xml2。我尝试了xml_children(notes)
和其他一些事情,例如as_list(xml_children(notes))
。
XML看起来像这样:
<RESULTS>
<ROW>
<COLUMN NAME="SUBJECT_ID"><![CDATA[12345678]]></COLUMN>
<COLUMN NAME="PAT_ID"><![CDATA[12345678]]></COLUMN>
<COLUMN NAME="PAT_MRN_ID"><![CDATA[12345678]]></COLUMN>
<COLUMN NAME="PAT_ENC_CSN_ID"><![CDATA[222111333]]></COLUMN>
<COLUMN NAME="CREATE_INSTANT_DTTM"><![CDATA[18-JUL-01]]></COLUMN>
<COLUMN NAME="NAME"><![CDATA[Progress Notes]]></COLUMN>
<COLUMN NAME="NOTE_ID"><![CDATA[123456]]></COLUMN>
<COLUMN NAME="LINE"><![CDATA[1]]></COLUMN>
<COLUMN NAME="NOTE_TEXT"><![CDATA[ text text text]]></COLUMN>
</ROW>
我想要一个看起来像的数据框 notes $ SUBJECT_ID, notes $ PAT_ID ... notes $ NOTE_TEXT
但是如何?
答案 0 :(得分:0)
我已自由调整您的示例。每列的条目数相等。
library(xml2)
library(tidyverse)
string <- "
<ROW>
<COLUMN NAME=\"SUBJECT_ID\"><![CDATA[12 345 678]]></COLUMN>
<COLUMN NAME=\"PAT_ID\"><![CDATA[123 456 78]]></COLUMN>
<COLUMN NAME=\"PAT_MRN_ID\"><![CDATA[12 345 678]]></COLUMN>
<COLUMN NAME=\"PAT_ENC_CSN_ID\"><![CDATA[222 1113 33]]></COLUMN>
<COLUMN NAME=\"CREATE_INSTANT_DTTM\"><![CDATA[18-JUL-01 19-JUL-02 19-JUL-02]]></COLUMN>
<COLUMN NAME=\"NAME\"><![CDATA[Progress Notes NN]]></COLUMN>
<COLUMN NAME=\"NOTE_ID\"><![CDATA[12 345 6]]></COLUMN>
<COLUMN NAME=\"LINE\"><![CDATA[1 1 2]]></COLUMN>
<COLUMN NAME=\"NOTE_TEXT\"><![CDATA[text text text]]></COLUMN>
</ROW>"
xml <- read_xml(string)
xml %>%
xml_contents() %>%
xml_text() %>%
map_dfc(~ unlist(str_split(.x, " "))) %>%
magrittr::set_colnames(
xml %>%
xml_contents() %>%
xml_attrs() %>%
flatten_chr()
)
# A tibble: 3 x 9
SUBJECT_ID PAT_ID PAT_MRN_ID PAT_ENC_CSN_ID CREATE_INSTANT_DTTM NAME NOTE_ID LINE NOTE_TEXT
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 12 123 12 222 18-JUL-01 Progress 12 1 text
2 345 456 345 1113 19-JUL-02 Notes 345 1 text
3 678 78 678 33 19-JUL-02 NN 6 2 text