我在这个格式的R数据框中有一个变量,具有混合格式:
98 (56:78)
34 (45:67)
45
67 (34:98)
我希望将该列划分为3个值,并将每个值放入数据框的新列中。
98 56 78
34 45 67
45 NA NA
67 34 98
我该怎么做? 非常感谢你!
答案 0 :(得分:4)
使用您的样本数据
models.ts
您可以使用
使用tidyverse(特别是tidyr包)dd <- data.frame(a=c("98 (56:78)", "45"))
答案 1 :(得分:1)
这是一个更长的基本R方法,它返回一个漂亮的data.frame。
setNames(do.call(rbind.data.frame,
regmatches(temp, regexec("(\\d+) \\((\\d+):(\\d+)\\)$", temp)))[-1],
paste0("V", 1:3))
在这里,regexec
使用正则表达式“(\ d +)\((\ d +):( \ d +)\)$”选择所需的数字,regmatches
返回长度相等的列表每个元素长度为4的输入。此列表将变为带有do.call
和rbind.data.frame
的data.frame,并删除包含完整字符串的第一列。最后,setNames
将丑陋的默认名称替换为更易于管理的名称。
返回
V1 V2 V3
1 98 56 78
2 91 53 76
3 99 53 75
请注意,变量是此上下文中的因子变量,通常不是很有用。要将这些转换为数字,您可以使用dat[] <- lapply(dat, as.numeric)
范例。
数据强>
temp <- c("98 (56:78)", "91 (53:76)", "99 (53:75)")
答案 2 :(得分:1)
使用extract()
的整洁解决方案:
library(tidyverse)
df <- data_frame(a = c("98 (56:78)", "10"))
df %>%
extract(a, into = c("x", "y", "z"), regex = "(\\d*) ?\\(?(\\d*):?(\\d*)") %>%
mutate_at(vars(x, y, z), as.integer)
结果是:
# A tibble: 2 x 3
x y z
<int> <int> <int>
1 98 56 78
2 10 NA NA