我想将某个格式的数据从一列拆分为多列。以下是我的示例数据:
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。
任何帮助将不胜感激。
答案 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