2017-07-25 15 views
0

0, 1, 2で構成された(1行から次の長さが不均一な)データフレームに列があります。 (文字列は、必ずしも数値である必要はありません。彼らは、文全体にわたる音節にストレスの度合いを表す。)(非常に単純化された)例最小:私は必要なものR - 一意の2桁と3桁の文字列の部分集合を抽出して数えます。

> 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

df$bに文字列のすべての2または3要素の組み合わせを取得し、その後、すべての組み合わせを取得するために使用expand.grid

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 

その頻度をカウントするtableを使用0の2および3要素、1、および2。その後、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 

DATA

df = structure(list(a = c("foo", "bar"), b = c("0100101", "01201")), .Names = c("a", 
"b"), row.names = c(NA, -2L), class = "data.frame") 
内のすべての発生をカウントするために gregexprを使用
関連する問題