在 tidyR separate_rows() 及其 "sep" 属性中使用正则表达式不起作用
Using regex in tidyR separate_rows() and its "sep"-attribute does not work
我有这些数据:
df <- data.frame("author" = c("Kardos, NN (Fraunhofer Austria); Laflamme, NN (Fraunhofer Austria); Gallina, NN (Fraunhofer Austria); Sihn, NN (Fraunhofer Austria; TU Wien)",
"Demeter, NN (TU Wien; TU Wien); Derx, NN (TU Wien); Komma, NN (TU Wien); Parajka, NN (TU Wien); Schijven, NN (National Institute for Public Health and the Environment; Utrecht University); Sommer, NN (Medical University of Vienna)",
"Prendl, NN (TU Wien); Schenzel, NN (TU Wien); Hofmann, NN (TU Wien)",
"Müller, NN (TU Wien); Knoll, NN (TU Wien; TU Wien); Gravogl, NN (TU Wien; University of Vienna); Jordan, NN (TU Wien); Eitenberger, NN (TU Wien); Friedbacher, NN (TU Wien); Artner, Werner (TU Wien); Welch, NN M. (TU Wien); Werner, NN (TU Wien)"
))
使用特定的正则表达式(我从 获得),我能够提取每个人。这很好用:
stringr::str_extract_all(df$author, "\w+,\s*\w+\s*\([^()]*(?:\([^()]*\)[^()]*)*\);?")
但是,当我使用 tidyr::separate_rows()
:
时,相同的正则表达式不起作用
tidyr::separate_rows(df, author, sep = "\w+,\s*\w+\s*\([^()]*(?:\([^()]*\)[^()]*)*\);?")
怎么来的?这里的问题是什么?如何将正则表达式与 separate_rows()
一起使用?
一种方法是将 df
的行重复提取值的 lengths
。
values <- stringr::str_extract_all(df$author, "\w+,\s*\w+\s*\([^()]*(?:\([^()]*\)[^()]*)*\);?")
result <- transform(df[rep(seq(nrow(df)), lengths(values)), ], author = unlist(values))
这里的要点是,用于提取 文本的正则表达式与您需要获取的文本相匹配。拆分函数中使用的正则表达式 删除 匹配项并在匹配项的位置拆分原始字符串。
您可以使用
tidyr::separate_rows(df, author, sep = "(?<=\));\s*")
详情
(?<=\))
- 紧接在 )
之前的位置
;
- 一个分号
\s*
- 零个或多个空格。
找到这些匹配项,separate_rows
将在匹配项出现的地方拆分原始字符串,同时删除匹配文本。
我有这些数据:
df <- data.frame("author" = c("Kardos, NN (Fraunhofer Austria); Laflamme, NN (Fraunhofer Austria); Gallina, NN (Fraunhofer Austria); Sihn, NN (Fraunhofer Austria; TU Wien)",
"Demeter, NN (TU Wien; TU Wien); Derx, NN (TU Wien); Komma, NN (TU Wien); Parajka, NN (TU Wien); Schijven, NN (National Institute for Public Health and the Environment; Utrecht University); Sommer, NN (Medical University of Vienna)",
"Prendl, NN (TU Wien); Schenzel, NN (TU Wien); Hofmann, NN (TU Wien)",
"Müller, NN (TU Wien); Knoll, NN (TU Wien; TU Wien); Gravogl, NN (TU Wien; University of Vienna); Jordan, NN (TU Wien); Eitenberger, NN (TU Wien); Friedbacher, NN (TU Wien); Artner, Werner (TU Wien); Welch, NN M. (TU Wien); Werner, NN (TU Wien)"
))
使用特定的正则表达式(我从
stringr::str_extract_all(df$author, "\w+,\s*\w+\s*\([^()]*(?:\([^()]*\)[^()]*)*\);?")
但是,当我使用 tidyr::separate_rows()
:
tidyr::separate_rows(df, author, sep = "\w+,\s*\w+\s*\([^()]*(?:\([^()]*\)[^()]*)*\);?")
怎么来的?这里的问题是什么?如何将正则表达式与 separate_rows()
一起使用?
一种方法是将 df
的行重复提取值的 lengths
。
values <- stringr::str_extract_all(df$author, "\w+,\s*\w+\s*\([^()]*(?:\([^()]*\)[^()]*)*\);?")
result <- transform(df[rep(seq(nrow(df)), lengths(values)), ], author = unlist(values))
这里的要点是,用于提取 文本的正则表达式与您需要获取的文本相匹配。拆分函数中使用的正则表达式 删除 匹配项并在匹配项的位置拆分原始字符串。
您可以使用
tidyr::separate_rows(df, author, sep = "(?<=\));\s*")
详情
(?<=\))
- 紧接在)
之前的位置
;
- 一个分号\s*
- 零个或多个空格。
找到这些匹配项,separate_rows
将在匹配项出现的地方拆分原始字符串,同时删除匹配文本。