从R中的字符串中提取特定部分

Extract certain part from a string in R

我想提取字符串的一部分。这是一个示例数据集。

df <- data.frame(id = c(1,2),
                 string = c('<itemResponse><response id="editIn_1.RESPONSE_1"><value>ETC_CHOICE_2</value>',
                            '<itemResponse><response id="editIn_1.RESPONSE_1"><value>ETC_CHOICE_4</value>'))

> df
  id                                                                       string
1  1 <itemResponse><response id="editIn_1.RESPONSE_1"><value>ETC_CHOICE_2</value>
2  2 <itemResponse><response id="editIn_1.RESPONSE_1"><value>ETC_CHOICE_4</value>

我想从长字符串中提取 ETC_CHOICE_2ETC_CHOICE_4。我想要的输出是:

> df
  id                                                                       string  extract
1  1 <itemResponse><response id="editIn_1.RESPONSE_1"><value>ETC_CHOICE_2</value>  ETC_CHOICE_2
2  2 <itemResponse><response id="editIn_1.RESPONSE_1"><value>ETC_CHOICE_4</value>  ETC_CHOICE_4

有人知道吗?

谢谢!

一个选项是使用 XML

中的 htmlParse
library(XML)
library(dplyr)
df %>% 
  mutate(extract = htmlParse(string) %>%
                    getNodeSet("//value") %>%
                    xmlValue)

-输出

#id                                                                       string      extract
#1  1 <itemResponse><response id="editIn_1.RESPONSE_1"><value>ETC_CHOICE_2</value> ETC_CHOICE_2
#2  2 <itemResponse><response id="editIn_1.RESPONSE_1"><value>ETC_CHOICE_4</value> ETC_CHOICE_4

您可以使用正则表达式提取 <value></value> 之间的所有内容。

df$extract <- sub('.*<value>(.*)</value>', '\1', df$string)
df

#  id                                                                       string      extract
#1  1 <itemResponse><response id="editIn_1.RESPONSE_1"><value>ETC_CHOICE_2</value> ETC_CHOICE_2
#2  2 <itemResponse><response id="editIn_1.RESPONSE_1"><value>ETC_CHOICE_4</value> ETC_CHOICE_4