我有一个数据集,其中的列是调查问题,行中的值包含被回答者选择的答案以及多个HTML标记。我正在尝试删除所有HTML标签,仅保留答案文本。
在Excel中,这可以通过用空字符串代替<*>
来完成。我无法弄清楚如何在R中执行此操作,因为我遇到的问题是我无法使通配符在第一个大于括号之后停止。相反,它只是将其识别为通配符的一部分,并继续到字符串的末尾。我在下面包括了一个玩具数据集和我的尝试。
temp <- data.frame(one = c('<b style="font-weight: normal;"><span style="font-size: 12pt; font-family: "Times New Roman";white-space: pre-wrap;">Answer 1</span></b>',
'<b style="font-weight: normal;"><span style="font-size: 12pt; font-family: "Times New Roman";white-space: pre-wrap;">Answer 2</span></b>',
'<b style="font-weight: normal;"><span style="font-size: 12pt; font-family: "Times New Roman";white-space: pre-wrap;">Answer 3</span></b>'),
two = c('<b style="font-weight: normal;"><span style="font-size: 12pt; font-family: "Times New Roman";white-space: pre-wrap;">apples are red</span></b>',
'<b style="font-weight: normal;"><span style="font-size: 12pt; font-family: "Times New Roman";white-space: pre-wrap;">apples are blue</span></b>',
'<b style="font-weight: normal;"><span style="font-size: 12pt; font-family: "Times New Roman";white-space: pre-wrap;">apples are bananas</span></b>'))
temp[] <- sapply(temp, function(x) gsub('<.*>+', "", x))
# what I want the new temp to look like (above code results in empty strings
data.frame(one = c("Answer 1",
"Answer 2",
"Answer 3"),
two = c("apples are red",
"apples are blue",
"apples are bananas
我尝试将代码用于第n次出现,但仍在第一个实例到字符串末尾继续使用。
我缺少使它在第一个实例后终止的正则表达式命令是什么?另外,我假设它将在完成第一次删除后继续移动到下一行,从而迫使我运行gsub()
n次,其中n是任何给定列中标签的最大数目。这不是特别有问题,但是有解决方法吗?
答案 0 :(得分:1)
从regex
文档中查看以下摘录:
默认情况下,重复是贪婪的,因此最大重复次数为 使用重复。可以通过将
?
附加到以下来将其更改为“最小” 量词。 (还有更多的量词可以近似 匹配:请参阅TRE文档。)
temp[] <- sapply(temp, function(x) gsub('<.*?>', "", x))
one two
1 Answer 1 apples are red
2 Answer 2 apples are blue
3 Answer 3 apples are bananas
要回答您的第二个问题,gsub
将替换所有匹配项(而不是sub
,后者仅替换第一个匹配项)-因此您应该没事。
答案 1 :(得分:1)
使用df.dropna(subset=[df.columns[1]])
Out[407]:
index value
0 1 2.0
1 2 6.0
3 4 8.0
,我们可以提取str_extract
和>
之间的单词字符和空格:
<
输出:
library(stringr)
library(dplyr)
temp %>%
mutate_all(str_extract, "(?<=\\>)[\\w\\s]+(?=\\<)")