R - 提取物&计算所有独特的2和3位字符串子集

时间:2017-07-25 21:49:19

标签: r

我在数据框中有一列,其中包含由0, 1, 2组成的序列(从一行到下一行的长度不均匀)。 (字符串不一定需要是数字;它们表示整个句子中音节的压力程度。)最小(非常简化)示例:

> df
a     b
foo   0100101
bar   01201

我需要的是一个数据帧,它在该列中提供每个2位或3位组合(数字可以自己出现,例如00)以及整个数据帧中每个组合的总数。 (每行的计数也很不错,但我担心这需要一些重塑,现在不是我的目标。)缩写的预期结果:

> output
combo     count
00        1
01        5
10        2
    ...
001       1
010       2
    ...

等等。我在str_count尝试了很多变种而没有成功。

1 个答案:

答案 0 :(得分:1)

<强> 1

df$b中的字符串获取所有2或3个元素组合,然后使用table计算其频率

table(unlist(lapply(c(2, 3),
                function(i) lapply(df$b,
                                function(x) sapply(1:(nchar(x) - (i - 1)),
                                                function(j) substr(x, j, j + i - 1))))))

# 00 001  01 010 012  10 100 101  12 120  20 201 
#  1   1   5   2   1   2   1   1   1   1   1   1 

<强> 2

使用expand.grid获取012的2和3个元素的所有组合。然后,使用gregexpr计算df$b

中的所有匹配项
sapply(c(do.call(paste0, (expand.grid(0:2, 0:2))),
         do.call(paste0, (expand.grid(0:2, 0:2, 0:2)))),
       function(x){
           temp = unlist(gregexpr(pattern = x, text = df$b))
           length(temp[temp != -1])
       })
# 00  10  20  01  11  21  02  12  22 000 100 200 010 110 210 020 120 220 001 
#  1   2   1   5   0   0   0   1   0   0   1   0   2   0   0   0   1   0   1 
#101 201 011 111 211 021 121 221 002 102 202 012 112 212 022 122 222 
#  1   1   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0 

数据

df = structure(list(a = c("foo", "bar"), b = c("0100101", "01201")), .Names = c("a", 
"b"), row.names = c(NA, -2L), class = "data.frame")