【发布时间】:2018-05-25 13:50:08
【问题描述】:
我有一列包含用逗号分隔的四个短语的组合,我需要将带有 extract 函数的列从 tidyr 包拆分为四个新列。同时,我希望保持列的顺序,并在原始列之后输入任何新列,而不是在数据集的末尾。新列应该只包含原始列中的一个短语,因此函数separate 在这里不合适。 extract 函数需要正则表达式参数,但我不知道如何定义它。
该列包含以下短语的所有组合:
"Underweight",
"Healthy weight",
"Overweight",
"Very Overweight"
以下是您可以使用上述短语获得的可能组合:
"Underweight",
"Healthy weight",
"Overweight",
"Very Overweight",
"Underweight,Healthy weight",
"Underweight,Overweight",
"Underweight,Very Overweight",
"Healthy weight,Overweight",
"Healthy weight,Very Overweight",
"Overweight,Very Overweight",
"Underweight,Healthy weight,Overweight",
"Underweight,Healthy weight,Very Overweight",
"Underweight,Overweight,Very Overweight",
"Healthy weight,Overweight,Very Overweight",
"Underweight,Healthy weight,Overweight,Very Overweight"
这是从该列中提取的样本(请注意,您可以将变量从因子强制转换为字符):
structure(list(routine_provided_target = structure(c(15L, 15L,
15L, NA, 15L, 10L, 15L, 15L, 10L, 15L, NA, NA, NA, NA, 13L, NA,
10L, 15L, 15L, NA, NA, NA, 15L, NA, NA, NA, 13L, 15L, 9L, 15L,
15L, NA, NA, NA, NA, 15L, NA, 13L, 4L, 15L, 15L, NA, NA, NA,
NA, NA, 13L, NA, NA, NA), .Label = c("Underweight", "Healthy weight",
"Overweight", "Very Overweight", "Underweight,Healthy weight",
"Underweight,Overweight", "Underweight,Very Overweight", "Healthy weight,Overweight",
"Healthy weight,Very Overweight", "Overweight,Very Overweight",
"Underweight,Healthy weight,Overweight", "Underweight,Healthy weight,Very Overweight",
"Underweight,Overweight,Very Overweight", "Healthy weight,Overweight,Very Overweight",
"Underweight,Healthy weight,Overweight,Very Overweight"), class = c("ordered",
"factor")), duration = c(27.6666666666667, 25.45, 16.1166666666667,
16.85, 17.9333333333333, 34.05, 24.7666666666667, 32.6166666666667,
21.55, 18.4833333333333, 0.55, 3.23333333333333, 24.3166666666667,
0.483333333333333, 47.1833333333333, 1.43333333333333, 151.933333333333,
33.4166666666667, 76.6833333333333, 1.1, 0.65, 1.83333333333333,
23.1166666666667, 17.8333333333333, 2.61666666666667, 0.683333333333333,
14.6833333333333, 8.8, 18.8, 12.8833333333333, 17.6833333333333,
22.8166666666667, 10, 14.2666666666667, 75.7166666666667, 51.4333333333333,
27.5833333333333, 30.6833333333333, 36.8666666666667, 23.25,
155.716666666667, 1.73333333333333, 1.41666666666667, 0.233333333333333,
1.85, 1.35, 25.3666666666667, 0.816666666666667, 6.71666666666667,
0.75)), row.names = c(NA, -50L), class = c("tbl_df", "tbl", "data.frame"
))
这是尝试执行我需要的代码;然而,正则表达式参数不能正常工作,它做了一些分离但它是一团糟,它应该包含整个短语:
library(tidyr)
library(dplyr)
sample %>%
extract(routine_provided_target, c(
"routine_provided_uw",
"routine_provided_hw",
"routine_provided_ow",
"routine_provided_vow"
),
regex = "([a-zA-Z]+)([a-zA-Z]+)([a-zA-Z]+)([a-zA-Z]+)",
remove = F
)
所需的输出接近于以下内容:
structure(list(routine_provided_target = structure(c(15L, 15L,
15L, NA, 15L, 10L), .Label = c("Underweight", "Healthy weight",
"Overweight", "Very Overweight", "Underweight,Healthy weight",
"Underweight,Overweight", "Underweight,Very Overweight", "Healthy weight,Overweight",
"Healthy weight,Very Overweight", "Overweight,Very Overweight",
"Underweight,Healthy weight,Overweight", "Underweight,Healthy weight,Very Overweight",
"Underweight,Overweight,Very Overweight", "Healthy weight,Overweight,Very Overweight",
"Underweight,Healthy weight,Overweight,Very Overweight"), class = c("ordered",
"factor")), routine_provided_uw = c("Underwei", "Underwei", "Underwei",
NA, "Underwei", "Overwei"), routine_provided_hw = c("g", "g",
"g", NA, "g", "g"), routine_provided_ow = c("h", "h", "h", NA,
"h", "h"), routine_provided_vow = c("t", "t", "t", NA, "t", "t"
), duration = c(27.6666666666667, 25.45, 16.1166666666667, 16.85,
17.9333333333333, 34.05)), row.names = c(NA, -6L), class = c("tbl_df",
"tbl", "data.frame"))
在输出中,您可以看到提取函数在原始列之后和数据集中已经存在的任何列之前创建新列,列的顺序被保留。
感谢您就如何实现这一目标提出任何建议。除了正则表达式行之外的整个代码都应该可以工作。
【问题讨论】:
-
它不起作用,因为没有指定的
,分隔符。还有,单词之间有空格 -
@akrun 感谢您的评论,是的,我知道这一点,但我不知道正确的正则表达式来考虑这一点。