通过组合调度结果来构建矢量/帧

时间:2014-11-24 13:56:33

标签: r

我有一个解析大量文本的正则表达式,在执行regmatches(myText,myRegex)时会返回list,如下所示:

[[1]]
  [1] "a=1"  "b=3"  "a=9"  "c=2"  "b=4"
...

我想建立一个data.frametable - 无论什么最适合 - 最终得到类似的东西:

a  b  c
1  3  2
9  4  ...

有可能以简单的方式制作吗?你有什么建议吗?

提前致谢。

4 个答案:

答案 0 :(得分:3)

这里的一般情况并不完全清楚,但这适用于所提供的数据。

假设这个输入:

x <- c("a=1", "b=3", "a=9", "c=2", "b=4")

按照生成s的名称拆分值并按摩到data.frame:

s <- split(as.numeric(sub(".*=", "", x)), sub("=.*", "", x))
as.data.frame(do.call(cbind, lapply(s, ts)))

,并提供:

  a b  c
1 1 3  2
2 9 4 NA

不需要包裹。

答案 1 :(得分:1)

您可以使用base R方法

d1 <- read.table(text=gsub("[[:punct:]]", " " , unlist(lst)))
d2 <- transform(d1, indx=ave(seq_along(V1), V1, FUN=seq_along))
res <- reshape(d2, timevar='V1', idvar='indx', direction='wide')[,-1]
colnames(res) <- gsub(".*\\.", "", colnames(res))
res
#  a  b  c
#1 1  3  2
#3 9  4  2
#6 4  5 NA
#9 9 NA NA

或使用dcastreshape2的{​​{1}}

d2

数据

library(reshape2)
dcast(d2,indx~V1, value.var='V2')[,-1]
#  a  b  c
#1 1  3  2
#2 9  4  2
#3 4  5 NA
#4 9 NA NA

答案 2 :(得分:1)

使用rex可能会使这种类型的提取任务变得更加简单。

x <- c("a=1", "b=3", "a=9", "c=2", "b=4", "a=2")

首先从字符串中提取名称和值。

library(rex)

matches <- re_matches(x,
  rex(
    capture(name="name", letter),
    "=",
    capture(name="value", digit)
    ))
#>  name value
#>1    a     1
#>2    b     3
#>3    a     9
#>4    c     2
#>5    b     4
#>6    a     2

然后使用split()计算群组。

groups <- split(as.numeric(matches$value), matches$name)
#>$a
#>[1] 1 9 2
#>
#>$b
#>[1] 3 4
#>
#>$c
#>[1] 2

如果我们尝试直接从split()转换为data.frame,那么成员较少的群组将会回收其成员而不是NA,因此请明确填写NA。< / p>

largest_group <- max(sapply(groups, length))
#>[1] 3

groups <- lapply(groups, function(group) {
  if (length(group) < largest_group) {
    group[largest_group] <- NA
  }
  group
})
#>$a
#>[1] 1 9 2
#>
#>$b
#>[1]  3  4 NA
#>
#>$c
#>[1]  2 NA NA

最后我们可以创建data.frame

do.call('data.frame', groups)
#>  a  b  c
#>1 1  3  2
#>2 9  4 NA
#>3 2 NA NA

答案 3 :(得分:0)

这是一种使用我的&#34; splitstackshape&#34;包:

library(splitstackshape)
dcast.data.table(                  ## Makes the long data wide
  getanID(                         ## Adds an ID variable for dcast
    ## create a single column data.table and split it by the "="
    cSplit(as.data.table(unlist(lst)), "V1", "="), "V1_1"), 
  .id ~ V1_1, value.var = "V1_2")
#    .id a  b  c
# 1:   1 1  3  2
# 2:   2 9  4  2
# 3:   3 4  5 NA
# 4:   4 9 NA NA

这使用@ akrun的样本数据:

lst <- list(c('a=1', 'b=3', 'a=9', 'c=2', 'b=4'), 
            c('a=4', 'c=2', 'b=5', 'a=9'))