将列拆分为不同的列

时间:2017-10-25 19:10:57

标签: r dataframe split multiple-columns

我在这个格式的R数据框中有一个变量,具有混合格式:

98 (56:78)
34 (45:67)
45
67 (34:98)

我希望将该列划分为3个值,并将每个值放入数据框的新列中。

98 56 78
34 45 67
45 NA NA
67 34 98

我该怎么做? 非常感谢你!

3 个答案:

答案 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.callrbind.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