按特定格式拆分为多列

时间:2017-08-10 08:38:30

标签: r

我想将某个格式的数据从一列拆分为多列。以下是我的示例数据:

df = data.frame(id=c(1,2),data=c('^apple:1%2%3^orange:3%4%5',
                                   '^apple:4%5%6^orange:7%8%9'))
#    id    data
#    1    ^apple:1%2%3^orange:3%4%5
#    2    ^apple:4%5%6^orange:7%8%9

然后将提供以下输出

 id   data_apple_A  data_apple_B  data_apple_C  data_orange_A  data_orange_B  data_orange_C
 1       1               2              3             3             4              5
 2       4               5              6             7             8              9

我使用以下代码尝试获取A,B和C的值(它们可能是十进制值):

cSplit(df, "data", sep="\\^", fixed = FALSE,direction= "long")[, c('valA','valB','valC')
        :=(str_extract(data, "\\d+\\.*\\d*")),str_extract(data, "(?<=%)\\d+\\.*\\d*"),
        str_extract(data, "(?<=%)\\d+\\.*\\d*$") ][]

但收到以下错误:

Error in `[.data.table`(cSplit(df, "data", sep = "\\^", fixed = FALSE,  : 
  Provide either 'by' or 'keyby' but not both

请注意,苹果和橙子只是一个占位符。它可以是字符,^(str)的数量:每行也可以不同。 此外,A B C是固定的。对于每个^(str):,只有3个十进制或非十进制数,格式为1%2%3。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

以下是使用library(tidyr) df %>% extract(data, into = paste(rep("data", 6), c("apple", "orange"), rep(c("A", "B", "C"), 2), sep = "_"), regex = "\\^apple:([0-9])\\%([0-9])\\%([0-9])\\^orange:([0-9])\\%([0-9])\\%([0-9])") 的解决方案:

PdfStamper