我有一个解析大量文本的正则表达式,在执行regmatches(myText,myRegex)
时会返回list
,如下所示:
[[1]]
[1] "a=1" "b=3" "a=9" "c=2" "b=4"
...
我想建立一个data.frame
或table
- 无论什么最适合 - 最终得到类似的东西:
a b c
1 3 2
9 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
或使用dcast
上reshape2
的{{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'))